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

String a = "abc"; String b = a.substring(1); b.intern(); String c = "bc"; System.out.println(b == c); 

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

什么时候

 String b = a.substring(1) 

执行,String b引用具有"bc"对象

b.intern是否在String Constant池中创建文字"bc" ,即使它确实如此,为什么b==c导致true

String b = a.substring(1); 返回包含"bc"字符串实例,但此实例不是字符串池的一部分(默认情况下只有文字是interned,通过new String(data)创建的new String(data)并且从substringnextLine这样的方法返回的默认情况下不会被nextLine )。

现在你调用的时候

 b.intern(); 

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

所以现在String池包含"abc""bc"

因为你打电话的时候

 String c = "bc"; 

表示bc字符串文字(与b引用中的相同)将从池中重用,这意味着bc将包含相同的实例

这确认了b==c结果,返回true

查看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