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

时间:2015-10-28 19:04:03

标签: java string literals

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

2 个答案:

答案 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引用中的相同)将从池中重复使用,这意味着bb将保存相同的实例

这确认c返回b==c的结果。