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