Java语言规范声明
当调用实习方法时,如果池已包含 字符串等于此String对象由。确定 equals(java.lang.Object)方法,然后是池中的字符串 返回
在以下代码段中:
class StringPoolTest {
public static void main(String[] args) {
String first = "string";
String second = new String("string");
String third = "string".intern();
System.out.println(System.identityHashCode(first));
System.out.println(System.identityHashCode(second));
System.out.println(System.identityHashCode(third));
}
}
输出:
989184670
268130470
989184670
我向池中添加了一个String对象 (将一个字符串文字分配给引用),并使用String构造函数显式创建了 second 。 池中现在有两个相同的字符序列。
我想看看在调用实习生时会返回哪一个。由于方法 hashCode 被覆盖了类String,我使用 System.identityHashCode 来确切地看到哪两个String引用是相同的。
显然, intern 返回了对使用String文字创建的对象的引用。为什么会这样?在池中有多个相同的String对象的情况下,是否有关于返回哪个引用的规则?
答案 0 :(得分:0)
当创建字符串文字(不使用新的Operator)时,JVM会检查内部列表中是否存在该字符串。如果它已存在于列表中,则它不会创建新的String,而是使用对现有String对象的引用。
JVM在内部对String字符进行此类检查,但不对String对象进行检查,它通过'new'关键字创建,即使用new始终返回新的字符串。