2 回答

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。
那么在你的例子中发生了什么?字符串实习。
任何字符串文字都由编译器分配在一个特殊的池中,并且任何重复的文字共享相同的引用。所以即使文字被定义了两次,就编译器而言,它们是同一个实例。

TA贡献1886条经验 获得超2个赞
您的测试结果为 true 的原因是 JVM 喜欢做的一件非常奇怪的事情。因为您已经定义了两个字面String
量,JVM 将决定存储这些值之一,并且让 a 和 b 引用同一个字符串。这就是为什么进行==
比较会导致true
.
正如其他人所说,这样做String b = new String("abc");
将强制创建一个新的String
文字,这将是一个单独的内存块。因此==
比较将导致false
。
添加回答
举报