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)
执行,字符串b
引用具有"bc"
b.intern
是否在字符串常量池中创建文字"bc"
,即使它确实如此,b==c
如何产生true
?
答案 0 :(得分:5)
查看String#intern()
方法
当调用intern方法时,如果池已经包含一个等于此String对象的字符串(由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
答案 1 :(得分:5)
String b = a.substring(1);
返回包含"bc"
的字符串实例,但此实例不是字符串池的一部分(默认情况下只有文字被内嵌,字符串通过new String(data)
创建,并从{{}等方法返回默认情况下,1}}或substring
不会被实习。
现在当你调用
nextLine
此方法检查String Pool是否包含等于b.intern();
中存储的字符串的字符串(即“bc”),如果不包含,则将该字符串放在那里。所以正常情况下,池中没有代表b
的字符串,它会在"bc"
处放置字符串。
所以现在字符串池包含b
和"abc"
。
因此,当你打电话时
"bc"
表示String c = "bc";
的字符串文字(与bc
引用中的相同)将从池中重复使用,这意味着b
和b
将保存相同的实例。
这确认c
返回b==c
的结果。