0

Java 语言规范指出

调用 intern 方法时,如果池中已经包含一个等于该 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 文字分配给引用),然后使用 String 构造函数显式创建第二个对象。现在池中有两个相同的字符序列。

我想看看调用intern时会返回哪一个。由于类 String的hashCode方法被覆盖,我使用System.identityHashCode来准确查看哪两个 String 引用是相同的。

显然,intern返回了对使用字符串文字创建的对象的引用。为什么会这样?如果池中有多个相同的 String 对象,是否有关于返回哪个引用的规则?

4

1 回答 1

0

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

JVM 在内部对字符串字面量进行这种类型的检查,但对字符串对象不进行检查,它是通过“new”关键字创建的,即使用 new 总是返回一个新字符串。

于 2018-01-09T13:22:51.780 回答