问题描述
我知道 String.intern() 将字符串添加到池中,如果它不包含对象,但如何解释结果。
代码如下:
public static void main(String[] args) {
char[] abc = new char[]{'a','b','c'};
String str = new String(abc);
System.out.println(str == "abc");
str.intern();
System.out.println(str == "abc");
}
输出是:
假
假
但是当代码如下:
public static void main(String[] args) {
char[] abc = new char[]{'a','c'};
String str = new String(abc);
str.intern();
System.out.println(str == "abc");
}
输出为:
真实
有什么不同。
解决方法
不同之处在于,当您在显式调用 String
之前使用 intern
字面量“abc”时,它是隐式的。
str.intern()
不会在字符串池中存储由 str
引用的实例,如果池中已经存在相等的 String
。
第一个片段:
System.out.println(str == "abc"); // "abc" is interned
str.intern(); // str is not stored in the pool
System.out.println(str == "abc"); // returns false
第二个片段:
str.intern(); // str is stored in the pool
System.out.println(str == "abc"); // returns true
来自实习生的Javadoc:
String java.lang.String.intern()
当调用 intern 方法时,如果池中已经包含了一个等于这个 String 对象的字符串,由 equals(Object) 方法确定,则返回池中的字符串。否则,将此 String 对象添加到池中并返回对此 String 对象的引用... 所有文字字符串和字符串值常量表达式被内嵌。