调用intern()时从池返回的String对象的引用

时间:2018-01-09 12:30:43

标签: java string string-pool

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对象的情况下,是否有关于返回哪个引用的规则?

1 个答案:

答案 0 :(得分:0)

当创建字符串文字(不使用新的Operator)时,JVM会检查内部列表中是否存在该字符串。如果它已存在于列表中,则它不会创建新的String,而是使用对现有String对象的引用。

JVM在内部对String字符进行此类检查,但不对String对象进行检查,它通过'new'关键字创建,即使用new始终返回新的字符串。