String.intern()显示奇怪的结果,它是如何工作的
我知道 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','b','c'};
String str = new String(abc);
str.intern();
System.out.println(str == "abc");
}
输出是:
真的
有什么不同。
回答
不同之处在于,当您String在显式调用 之前使用文字“abc”时intern,它会被隐式插入。
str.intern()str如果一个 equalString已经在池中,则不将引用的实例存储在字符串池中。
第一个片段:
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:
字符串 java.lang.String.intern()
当调用 intern 方法时,如果池中已经包含一个等于该 String 对象的字符串(由 equals(Object) 方法确定),则返回池中的字符串。否则,此 String 对象将添加到池中,并返回对此 String 对象的引用...
所有文字字符串和字符串值常量表达式都被 interned。