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
?
看看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)
String b = a.substring(1);
返回包含"bc"
但是此实例不是字符串池的一部分的字符串实例(默认情况下只有文字是interned,字符串是通过new String(data)
类似方法创建的,substring
也nextLine
可以是默认情况下不通过方法返回).
现在你调用的时候
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
的参考)将从池,这意味着被重新使用b
和c
将持有同一实例.
这证实了b==c
其结果true
.