public static void main(String[] args) {
String a = "abc";
String b = "abc";
System.out.println(a == b);
System.out.println(a.equals(b));
}
结果为true,但问题的答案为false。我想知道为什么。
答案 0 :(得分:4)
public static void main(String[] args) {
String a = new String("abc");
String b = new String("abc");
System.out.println(a.equals(b));
System.out.println(a == b);
}
先打印true
,然后再打印false
。因此,两个具有相同字符序列的字符串必须彼此equal
,但彼此可以==
。
很明显,a == a
在所有情况下都是有效的,并且a
是String
,包含与a
相同的字符序列。
但是在上面的示例中,我们正在创建两个不同的实例,它们恰好包含相同的字符序列。因此a != b
。
那么您的示例中发生了什么? String interning。
编译器会在特殊的池中分配任何字符串文字,并且任何重复的文字都共享相同的引用。因此,即使字面量定义了两次,就编译器而言,它们都是相同的实例。
答案 1 :(得分:3)
测试结果为true的原因是JVM喜欢做的一件很奇怪的事情。因为您已经定义了两个String
文字,所以JVM只会决定存储这些值之一,并且a和b都引用相同的字符串。这就是为什么在==
中进行true
比较的原因。
正如其他人所说,执行String b = new String("abc");
将强制生成新的String
文字,这将是一个单独的内存块。因此,==
比较将得出false
。