用 == 和 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 == a2
和 a1.equals(a2)
都是正确的。
但是,在这个,
String a1 = "a";
String a2 = new String("a");
我们明确地创建了一个新的 String 实例。所以,a1.equals(a2)
将为真。但是a1 == a2
不会。
什么时候 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 == a2
和 a1.equals(a2)
都是正确的。
但是,在这个,
String a1 = "a";
String a2 = new String("a");
我们明确地创建了一个新的 String 实例。所以,a1.equals(a2)
将为真。但是a1 == a2
不会。