String.intern() 显示奇怪的结果,它是如何工作的

周雪静*_*周雪静 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)

输出是:

真的

有什么不同。

Era*_*ran 7

不同之处在于,当您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