字符串实习生难题

时间:2012-09-05 09:27:39

标签: java string

  

可能重复:
  intern() behaving differently in Java 6 and Java 7

在这个blog上我找到了有趣的字符串拼图:

---引用---

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 ---

说实话我不明白为什么输出不同。能否请您解释一下这种行为的原因是什么?

2 个答案:

答案 0 :(得分: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。因此,用户名成为编译时常量并自动实现。

修改

有几个人指出你的代码在Java 6中打印为false,即使"test".length行被注释掉了。

这是由于one of the changes introduced in Java 7

  

在JDK 7中,实现的字符串不再分配在Java堆的永久生成中,而是分配在Java堆的主要部分(称为年轻和旧的代)中,以及创建的其他对象通过申请。

结果是the code you posted has different outputs in Java 6 and 7(参见错误报告底部的示例)。

答案 1 :(得分:5)

请检查Does String.intern() change reference of Original String

的回答
  

不是更改的字符串,而是用于更改的“test”的对象。

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

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

所以

true