String #intern对实习生的结果感到困惑

时间:2018-04-22 09:24:20

标签: java string jvm

public class Main {
    public static void main(String[] args) {
        String a = new String("11") ;
        a.intern();
        String b = "11";
        System.out.println(a == b);                  // false

        String c = new String("2") + new String("2");
        c.intern();
        String d = "22";
        System.out.println(c == d);                  // true
    }
}

打印:

false
true

我在jkd 1.8上运行它。我很困惑为什么第二个println结果。

1 个答案:

答案 0 :(得分:3)

String文字在第一次显示时始终会自动实现。您代码中的String文字是" 11"和" 2"。

另一方面,由于String连接而创建的String不会自动实现。

String a = new String("11"); // interns the String literal "11", and creates a
                             // different String instance referenced by a
a.intern(); // doesn't add a to the String pool, since "11" is already in 
            // the String pool
String b = "11"; // "11" returns the canonical instance already in the pool,
                 // which is != a

因此a != b

String c = new String("2") + new String("2"); // interns the String "2", creates 2 
                                              // more Strings having the same value,
                                              // and creates an additional String
                                              // whose value is "22", which is not
                                              // interned yet
c.intern(); // c is added to the String pool as the canonical instance whose value
            // is "22"
String d = "22"; // "22" returns the canonical instance already in the pool,
                 // which is == c

因此c == d

以上所有内容均来自intern的Javadoc:

  

返回字符串对象的规范表示。

     

字符串池(最初为空)由String类私有维护。

     

调用实习方法时,如果池已包含等于此字符串对象的字符串(由equals(Object)方法确定),则返回池中的字符串。 否则,此String对象将添加到池中,并返回对此String对象的引用。

     

接下来,对于任何两个字符串s和t,当且仅当s.equals(t)为真时,s.intern()== t.intern()才为真。

     

所有文字字符串和字符串值常量表达式都是实现的。字符串文字在The Java™语言规范的3.10.5节中定义。