(真或假)假设字符串对象 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));}结果是真的,但问题的答案是假的。我想知道为什么。
2 回答
![?](http://img1.sycdn.imooc.com/54584f240001db0a02200220-100-100.jpg)
侃侃尔雅
TA贡献1801条经验 获得超16个赞
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在所有情况下, anda是String包含与a.
但是在上面的示例中,我们创建了两个不同的实例,它们恰好包含相同的字符序列。因此a != b。
那么在你的例子中发生了什么?字符串实习。
任何字符串文字都由编译器分配在一个特殊的池中,并且任何重复的文字共享相同的引用。所以即使文字被定义了两次,就编译器而言,它们是同一个实例。
![?](http://img1.sycdn.imooc.com/545869470001a00302200220-100-100.jpg)
MM们
TA贡献1886条经验 获得超2个赞
您的测试结果为 true 的原因是 JVM 喜欢做的一件非常奇怪的事情。因为您已经定义了两个字面String
量,JVM 将决定存储这些值之一,并且让 a 和 b 引用同一个字符串。这就是为什么进行==
比较会导致true
.
正如其他人所说,这样做String b = new String("abc");
将强制创建一个新的String
文字,这将是一个单独的内存块。因此==
比较将导致false
。
添加回答
举报
0/150
提交
取消