用 == 和 equals() 比较两个字符串会给出不同结果的例子?

Example when two strings compared by == and equals() will give different results?

什么时候 a == b 为真而 a.equals(b) 为假,或者相反?

我知道 equals() 用于比较字符串的值,== 用于检查两个变量是否指向 String 对象的同一实例。 但是在什么情况下这两个会有所不同?

考虑这段代码,

String str1 = "ABC";
String str2 = new String("ABC");
System.out.println(str1==str2); // false
System.out.println(str1.equals(str2)); //true

原因是当你写 String str1="ABC" 这个字符串保存在 字符串池 并且 String str2 = new String("ABC") 在 [=17] 中创建新对象=]heap 并且它不会检查字符串池是否已经存在。但是由于两个字符串的内容相同,equals 方法 returns true.

虽然大多数编译器会保留字符串,以便

a = "Foo";
b = "Foo";
System.out.println(a == b);

通常会打印 True,你总是可以构造你知道相同但编译器不相同的字符串:

a = "Foo";
b = "Fo";
c = "o";
System.out.println((a == b + c));

这将几乎总是打印 False,而 a.equals(b + c) 将始终是 True。基本上不能保证内容相同的字符串会指向同一个对象

字符串本质上是不可变的。所以,当我们这样做时,

String a1 = "a";
String a2 = "a";

实际上在内存中,只创建了一个String实例"a"。 a1 和 a2 都指向同一个实例。

因此,a1 == a2a1.equals(a2) 都是正确的。

但是,在这个,

String a1 = "a";
String a2 = new String("a");

我们明确地创建了一个新的 String 实例。所以,a1.equals(a2) 将为真。但是a1 == a2不会。