实习生如何在以下代码中工作?
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)
并且从substring
或nextLine
这样的方法返回的默认情况下不会被nextLine
)。
现在你调用的时候
b.intern();
此方法检查String Pool是否包含等于b
存储的字符串(即“bc”),如果不包含,则将该字符串放在那里。 所以正常情况下,池中没有代表"bc"
字符串,它会将b
字符串放在那里。
所以现在String池包含"abc"
和"bc"
。
因为你打电话的时候
String c = "bc";
表示bc
字符串文字(与b
引用中的相同)将从池中重用,这意味着b
和c
将包含相同的实例 。
这确认了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