实习生如何在以下代码中工作?

Ari*_*pta 5 java string literals

String a = "abc";
String b = a.substring(1);
b.intern();
String c = "bc";
System.out.println(b == c);
Run Code Online (Sandbox Code Playgroud)

问题可能是愚蠢的,因为实习生在这里没有主要用法,我仍然对这个事实感到困惑,为什么会有b == c结果true.

什么时候

String b = a.substring(1)
Run Code Online (Sandbox Code Playgroud)

执行,String b对象的引用"bc"

是否在String Constant池中b.intern创建文字"bc",即使它确实如此,怎么会b==c产生true

Sur*_*tta 5

看看String#intern()方法的文档

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

现在按照评论

    String b = a.substring(1);  // results "bc"
    b.intern();                 // check and places "bc" in pool
    String c = "bc";            // since it is a literal already presented in pool it gets the reference of it
    System.out.println(b == c);// now b and c are pointing to same literal
Run Code Online (Sandbox Code Playgroud)


Psh*_*emo 5

String b = a.substring(1);返回包含"bc"但是此实例不是字符串池的一部分的字符串实例(默认情况下只有文字是interned,字符串是通过new String(data)类似方法创建的,substringnextLine可以是默认情况下不通过方法返回).

现在你调用的时候

b.intern();
Run Code Online (Sandbox Code Playgroud)

此方法检查String Pool是否包含等于存储的字符串b(即"bc"),如果不包含,则将该字符串放在那里.所以正常情况下"bc",池中没有字符串表示它会从b那里放置字符串.

所以现在String pool包含"abc""bc".

因为你打电话的时候

String c = "bc";
Run Code Online (Sandbox Code Playgroud)

字符串常量,代表bc(这是相同b的参考)将从池,这意味着被重新使用bc将持有同一实例.

这证实了b==c其结果true.