12 回答
TA贡献1812条经验 获得超5个赞
==
测试对象引用,.equals()
测试字符串值。
有时它看起来好像要==
比较值,因为Java会做一些幕后的东西来确保相同的内联字符串实际上是同一个对象。
例如:
String fooString1 = new String("foo");String fooString2 = new String("foo"); // Evaluates to falsefooString1 == fooString2; // Evaluates to truefooString1.equals(fooString2); // Evaluates to true, because Java uses the same object"bar" == "bar";
但要注意空值!
==
处理null
字符串很好,但从.equals()
空字符串调用将导致异常:
String nullString1 = null;String nullString2 = null; // Evaluates to trueSystem.out.print(nullString1 == nullString2); // Throws a NullPointerExceptionSystem.out.print(nullString1.equals(nullString2));
因此,如果您知道fooString1
可能为空,请通过写信告诉读者
System.out.print(fooString1 != null && fooString1.equals("bar"));
以下内容较短,但检查null(来自Java 7)不太明显:
System.out.print(Objects.equals(fooString1, "bar"));
TA贡献1963条经验 获得超6个赞
Java中的字符串是不可变的。这意味着每当您尝试更改/修改字符串时,您将获得一个新实例。您无法更改原始字符串。这样做是为了可以缓存这些字符串实例。典型的程序包含大量的字符串引用和缓存这些实例可以减少内存占用并提高程序的性能。
使用==运算符进行字符串比较时,您不是在比较字符串的内容,而是实际比较内存地址。如果它们都相等,则返回true和false。而字符串中的equals则比较字符串内容。
所以问题是如果所有字符串都缓存在系统中,那么如何==
返回false而equals返回true?嗯,这是可能的。如果您创建一个新的字符串,就像String str = new String("Testing")
您最终在缓存中创建一个新字符串,即使缓存已包含具有相同内容的字符串。总之"MyString" == new String("MyString")
将永远返回虚假。
Java还讨论了函数intern(),它可以在字符串上使用,使其成为缓存的一部分,因此"MyString" == new String("MyString").intern()
将返回true。
注意:==运算符比equals快得多,因为您要比较两个内存地址,但是您需要确保代码不在代码中创建新的String实例。否则你会遇到错误。
TA贡献1862条经验 获得超7个赞
String a = new String("foo");
String b = new String("foo");
System.out.println(a == b); // prints false
System.out.println(a.equals(b)); // prints true
确保你理解为什么。这是因为==比较只比较参考文献; 该equals()方法对内容进行逐字符比较。
当您拨打新a和b,每个人得到一个指向一个新的参考"foo"字符串表。引用不同,但内容相同。
TA贡献1817条经验 获得超14个赞
是的,这很糟糕......
==
意味着您的两个字符串引用完全相同。您可能听说过这种情况,因为Java保留了一个文字表(它确实如此),但情况并非总是如此。某些字符串以不同的方式加载,由其他字符串等构成,因此您绝不能假设两个相同的字符串存储在同一位置。
Equals为您进行真正的比较。
TA贡献1829条经验 获得超6个赞
是的,==
对于比较字符串(实际上是任何对象,除非你知道它们是规范的)是不好的。 ==
只是比较对象引用。 .equals()
测试平等。对于Strings来说,它们通常都是相同的,但正如你所发现的那样,总是不能保证。
TA贡献1860条经验 获得超8个赞
Java有一个String池,Java管理String对象的内存分配。请参阅Java中的字符串池
使用==运算符检查(比较)两个对象时,它会将地址相等性与字符串池进行比较。如果两个String对象具有相同的地址引用,则返回true,否则返回false。但是,如果要比较两个String对象的内容,则必须覆盖该equals方法。
equals 实际上是Object类的方法,但它被重写到String类中,并给出了一个比较对象内容的新定义。
Example:
stringObjectOne.equals(stringObjectTwo);
但请记住它尊重String的情况。如果你想要不区分大小写,那么你必须使用String类的equalsIgnoreCase方法。
让我们来看看:
String one = "HELLO";
String two = "HELLO";
String three = new String("HELLO");
String four = "hello";
one == two; // TRUE
one == three; // FALSE
one == four; // FALSE
one.equals(two); // TRUE
one.equals(three); // TRUE
one.equals(four); // FALSE
one.equalsIgnoreCase(four); // TRUE
TA贡献1852条经验 获得超7个赞
==
比较Java中的对象引用,对象也不例外String
。
为了比较对象(包括String
)的实际内容,必须使用该equals
方法。
如果使用的两个String
对象的比较==
结果是true
,那是因为String
对象被实现了,并且Java虚拟机有多个引用指向同一个实例String
。人们不应期望将String
包含相同内容的一个String
对象与另一个对象进行比较==
来评估为true
。
TA贡献1815条经验 获得超13个赞
我同意zacherates的回答。
但你可以做的是调用intern()
你的非文字字符串。
从zacherates示例:
// ... but they are not the same objectnew String("test") == "test" ==> false
如果你实习非文字字符串相等是 true
new String("test").intern() == "test" ==> true
TA贡献1859条经验 获得超6个赞
.equals()
比较类中的数据(假设函数已实现)。 ==
比较指针位置(对象在内存中的位置)。
==
如果两个对象(不是关于PRIMITIVES的对话)指向SAME对象实例,则返回true。 .equals()
如果两个对象在Java中包含相同的数据Versus ,则返回trueequals()
==
这可能对你有帮助。
添加回答
举报