5

我试图理解 Java 的String类,但我很难理解下面描述的情况。

考虑以下示例片段:

String x = new String("Hey");
String y = "Hey";

如果我使用bool = y == x.intern();变量bool将等于true.

我的问题是:

当我做出这样的声明时:

String b = "h";
String a = b.intern + "ey";
boolean x = a == "hey";

x的价值将是false,但当我做a = (b + "ey").intern(); x的价值将是true

为什么不会x = true在第二个例子中?是因为第一个例子中的声明不一样吗?如果是,有什么区别?

4

3 回答 3

5

用你的第一个例子:

String y = "Hey";

Java 会自动实习生字符串文字,例如(JLS 第 3.10.5 节):

此外,字符串字面量总是引用 String 类的同一个实例。这是因为字符串字面量 - 或者更一般地说,作为常量表达式值的字符串(第 15.28 节) - 是“内部的”,以便使用 String.intern 方法共享唯一实例。

因此,当您调用时x.intern(),您将获得的实习副本"Hey",因此它们是相同的对象并==返回true

但是在第二个示例中,b.intern()是在运行时评估的方法调用,Java 的连接运算符将返回一个新的String(未实习的),它是与字符串文字"hey"(已实习)不同的对象,因此==返回false(不同的对象)。

编辑

要弄清楚字符串连接会发生什么,请转到JLS 第 15.18.1 节

字符串连接的结果是对 String 对象的引用,该对象是两个操作数字符串的连接。在新创建的字符串中,左侧操作数的字符在右侧操作数的字符之前。

String 对象是新创建的(第 12.5 节),除非表达式是编译时常量表达式(第 15.28 节)。

但是,b.intern() + "ey";不是编译时常量表达式,因此结果对象尚未String被实习,并且==会检测到它与实习对象不同"hey"

于 2013-07-23T21:59:08.713 回答
3

这个创建一个字符串并存储它:

String a = b.intern() + "ey";

这个创建了一个字符串,对其进行实习并存储实习版本:

String a = (b + "ey").intern();

所有具有相同内容的实习字符串都是==

所有字符串文字(以“hey”形式提供的字符串)都由编译器在内部进行实习。

未实习但具有相同内容的字符串是 onlyequal()和 not==

对于后代,还有一个......编译器优化+结果为“hey”并实习它就像字符串文字“hey”一样

String a = "h" + "ey";
于 2013-07-23T21:58:32.817 回答
0

JavaString使用 s 连接 s StringBuilder

b.intern() + "ey"变成类似于 的东西
new StringBuilder(b.intern()).append("ey").toString()。这创造了一个新的,String所以它不会=="hey"

于 2013-07-23T22:00:45.427 回答