我正在做一个练习计算机科学测试并尝试了这个问题。
String sam = "scary";
String ben = new String("scary");
String wil = "scary";
out.print( sam == ben );
out.print( " " + (sam == wil) );
据我所知,我认为打印输出会是假的,因为据我所知,字符串只能与 .equals() 进行比较。但我弄错了。它说答案是假的。有人可以解释为什么吗?
您可以将字符串与==
. 但是,它比较的是字符串引用而不是字符序列。
如果两个字符序列不同,==
将始终计算为false
. 如果它们相同,==
则可能返回true
或可能返回false
;这取决于两个字符串对象是如何存在的。
JLS §3.10.5 String Literals中详细说明了原因sam
和wil
引用同一对象:
字符串文字 - 或者更一般地说,作为常量表达式值的字符串(第 15.28 节) - 是“内部的”,以便使用方法共享唯一实例
String.intern
。
有关此行为的详细说明,请参见 JLS 中的示例 3.10.5-1。
当您创建没有新单词的字符串时,jre 在您之前创建的字符串池中搜索具有相同内容的字符串,如果找到,则无需在内存中创建新字符串,只需引用将新字符串添加到您之前创建的字符串。另一方面,通过使用 new 关键字,您将强制创建一个新对象。