周雪静*_*周雪静 3 java string jvm string-constant 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");
}
Run Code Online (Sandbox Code Playgroud)
输出是:
错误的
错误的
但是当代码如下:
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");
}
Run Code Online (Sandbox Code Playgroud)
输出是:
真的
有什么不同。
不同之处在于,当您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
Run Code Online (Sandbox Code Playgroud)
第二个片段:
str.intern(); // str is stored in the pool
System.out.println(str == "abc"); // returns true
Run Code Online (Sandbox Code Playgroud)
来自实习生的Javadoc:
字符串 java.lang.String.intern()
当调用 intern 方法时,如果池中已经包含一个等于该 String 对象的字符串(由 equals(Object) 方法确定),则返回池中的字符串。否则,此 String 对象将添加到池中,并返回对此 String 对象的引用... 所有文字字符串和字符串值常量表达式都被 interned。