a == b
何时为真但a.equals(b)
为假,反之亦然?
我知道equals()
用于比较字符串的值和=
=来检查两个变量是否指向String对象的同一个实例。
但在这种情况下,这两者会有所不同吗?
答案 0 :(得分:7)
考虑这段代码,
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")
在堆中创建新对象如果它已经存在,它将不会检查字符串池。但由于两个字符串的内容相同,等于方法返回true。
答案 1 :(得分:2)
虽然大多数编译器都会实习字符串
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
。基本上,不能保证具有相同内容的字符串将指向同一个对象。
答案 2 :(得分:0)
字符串本质上是不可变的。所以,当我们这样做时,
String a1 = "a";
String a2 = "a";
实际上在内存中,只创建了一个字符串“a”的实例。 a1和a2都指向同一个实例。
这就是为什么,a1 == a2
和a1.equals(a2)
都是正确的。
但是,在此,
String a1 = "a";
String a2 = new String("a");
我们明确地创建了一个新的String实例。所以,a1.equals(a2)
将是真的。但是a1 == a2
不会。