15

可能重复:
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 update 7 下打印。

String object the same is: true

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

String object the same is: false

--- EoQ ---

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

4

2 回答 2

14

您需要将实习字符串分配回用户名:

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。因此 username 成为编译时间常数并自动被实习。

编辑

正如一些人指出的那样,您的代码在 Java 6 中打印为 false,即使该"test".length行已被注释掉。

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

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

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

于 2012-09-05T09:31:14.700 回答
5

请检查是否 String.intern() 更改原始字符串参考的答案

改变的不是字符串,而是用于“测试”的对象被改变。

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

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

所以

Commented //"test".length(); -> True
Un Commented "test".length(); --> False
于 2012-09-05T09:31:03.980 回答