在这个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 ---
说实话我不明白为什么输出不同。能否请您解释一下这种行为的原因是什么?
答案 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