在java字符串中使用实习生

Tar*_*man 5 java string variables object

我正在努力理解Java的String课程,但我很难理解下面描述的情况.

请考虑以下示例代码段:

String x = new String("Hey");
String y = "Hey";
Run Code Online (Sandbox Code Playgroud)

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

我的问题是:

当我做出这样的声明时:

String b = "h";
String a = b.intern + "ey";
boolean x = a == "hey";
Run Code Online (Sandbox Code Playgroud)

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

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

rge*_*man 5

用你的第一个例子:

String y = "Hey";
Run Code Online (Sandbox Code Playgroud)

Java会自动实现这样的字符串文字(JLS第3.10.5节):

此外,字符串文字始终引用类String的相同实例.这是因为字符串文字 - 或者更常见的是作为常量表达式(第15.28节)的值的字符串 - 被"实例化"以便使用String.intern方法共享唯一实例.

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

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

编辑

要清除字符串连接发生的情况,请转到JLS Section 15.18.1:

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

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

但是,b.intern() + "ey";编译时常量表达式,因此所得到的String对象还没有被扣留,并且==将检测到它是一个不同的对象比实习"hey".