(真或假)假设字符串对象b和c包含相同的字符序列。则b == c为真。
public static void main(String[] args) {
String a = "abc";
String b = "abc";
System.out.println(a == b);
System.out.println(a.equals(b));
}
结果是正确的,但问题的答案是错误的。我想知道为什么。
发布于 2018-08-06 05:56:38
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
是一个包含与a
相同的字符序列的String
。
但在上面的例子中,我们创建了两个不同的实例,它们恰好包含相同的字符序列。因此就有了a != b
。
那么在你的例子中发生了什么呢?String interning。
任何字符串文字都由编译器分配到一个特殊的池中,并且任何重复的文字都共享相同的引用。因此,即使文字被定义了两次,但就编译器而言,它们是同一个实例。
发布于 2018-08-06 05:54:15
测试结果为true的原因是JVM喜欢做的一件非常奇怪的事情。因为您已经定义了两个String
文字,所以JVM将决定存储其中一个值,并让a和b引用相同的字符串。这就是为什么在true
中进行==
比较的原因。
正如其他人所说,执行String b = new String("abc");
将强制生成一个新的String
文本,这将是一个单独的内存块。因此,==
比较将导致false
。
https://stackoverflow.com/questions/51698499
复制相似问题