Java 字符串实习生函数结果问题

Java String intern function result problem

我正在学习Java,我看了这个问题:What is Java String interning? - Stack Overflow
但我阅读了其他文章,其中提供了一些我不理解的示例:

    public static void main(String[] args) {
        String str2 = new String("str") + new String("01");
        str2.intern();
        String str1 = "str01";
        System.out.println(str2 == str1);  //true

        String s4 = new String("1");
        s4.intern();
        String s5 = "1";
        System.out.println(s4 == s5);   //false

        String s = new StringBuilder("aa").append("bb").toString();
        String s2 = new StringBuilder("cc").toString();
        System.out.println(s.intern() == s);    //true
        System.out.println(s2.intern() == s2);  //false
    }

Java 11 中的结果(在 Java 8 中应该相同)是:

true
false
true
false

我不知道为什么结果不同,我想这都是真的。 谁能解释一下?

让我们看看 intern 实际做了什么(强调我的):

When the intern method is invoked, if the pool already contains a string equal to this String object as determined by the equals(Object) method, then the string from the pool is returned. Otherwise, this String object is added to the pool and a reference to this String object is returned.

当此代码为运行时:

str2.intern();

字符串池仅包含"str""01"str2"str01",不在字符串池中,所以把str2引用的对象也加入到字符串池中。因此,当到达下一行时,由于 "str01" 已经在池中,因此 str1 将引用与 str2.

相同的对象

请注意,str2 == str1 之所以 而不是 ,是因为 intern 以某种方式改变了 str2 所指的对象。它不会str2做任何事情。毕竟字符串是不可变的。

现在我们可以理解第一个false了。在行中:

String s4 = new String("1");

由于字符串文字 "1""1" 被添加到字符串池中。请注意,添加到字符串池中的对象与 s4 引用的对象不同。现在您调用 s4.intern(),它对 s4 没有任何作用,并且 return 是字符串池 中的对象。但是您忽略了 return 值。这就是 s4 != s5s4.intern() == s5.

的原因

s2.intern() != s2 的原因要简单得多—— s2 与字符串池中的 "cc" 指的是不同的对象! s2.intern()应该是return字符串池中的对象,当然不是同一个对象!