弦乐实习生拼图

2022-09-03 14:07:38

可能的重复:
intern() 在 Java 6 和 Java 7 中的行为不同

在这个博客上,我发现了有趣的字符串谜题:

--- 报价---

String te = "te", st = "st";
//"test".length();
String username = te + st;
username.intern();
System.out.println("String object the same is: " 
   + (username == "test"));

在 Java 7 更新 7 下打印。

String object the same is: true

但取消注释“test”.length();行,或使用 Java 6 运行并打印

String object the same is: false

--- EoQ ---

老实说,我不明白为什么输出不同。你能解释一下这种行为的原因是什么吗?


答案 1

您需要将滞留字符串重新分配给用户名:

String username = te + st;
username = username.intern();

在这种情况下,两个代码都将输出 。true

这是另一个有趣的例子:

final String te = "te", st = "st";
"test".length();
String username = (te + st);
System.out.println("String object the same is: " + (username == "test"));

打印也为 true,因为 te 和 st 被标记为 final。因此,用户名成为编译时常量并自动滞留。

编辑

正如几个人指出的那样,即使该行被注释掉,Java 6的代码也打印错误。"test".length

这是由于 Java 7 中引入的更改之一

在 JDK 7 中,暂存字符串不再在 Java 堆的永久生成中分配,而是与应用程序创建的其他对象一起分配在 Java 堆的主要部分(称为年轻和旧一代)。

一个后果是,您发布的代码在 Java 6 和 7 中具有不同的输出(请参阅错误报告底部的示例)。


答案 2

请检查字符串.intern()是否更改原始字符串的引用的答案

更改的不是 String,而是用于“测试”的对象被更改。

因此,在你的情况下,如果首先定义,这意味着如果你先这样做,那么在字符串池中,所以第一个结果是。"test""test".length();"test"false

现在,在调用“test”后,现在添加到字符串池中,您用于比较的下一个将分配与方法放置的相同对象。因此,它是if you comment this lineusername.intern();"test"username.intern();true

所以

Commented //"test".length(); -> True
Un Commented "test".length(); --> False