9

我有这样的代码:

String str1 = new StringBuilder("计算机").append("软件").toString();
System.out.println(str1.intern() == str1); //true

String str2 = new StringBuilder("ja").append("va").toString();
System.out.println(str2.intern() == str2); //false

String str3 = new StringBuilder("Str").append("ing").toString();
System.out.println(str3.intern() == str3); //true

我能理解为什么str1.intern() == str1而且str3.intern() == str3是真的,但我不明白str2.intern() == str2。为什么这是假的?

我的java版本是:1.8.0_73

4

2 回答 2

17

String.intern() 在字符串文字池中返回一个字符串。但是,如果字符串已经存在于池中,它将返回现有的字符串。

如果您选择一个新字符串,它应该返回您创建的字符串,但是如果您使用一个恰好存在于池中的字符串,您将获得现有的字符串。

可以合理地假设在这种情况下"java"池中已经存在,因此当您调用 intern() 时,它返回一个不同的对象,因此==为假。

注意:string.intern().equals(string)应该始终为真。

于 2016-03-17T14:29:58.543 回答
4

该常量String "java"已经存在于 Java 常量池中,但您可以通过更改

String str2 = new StringBuilder("ja").append("va").toString();
System.out.println(str2.intern()==str2);

String str2 = new StringBuilder("ja").append("va").toString();
System.out.println(str2.intern() == "java");

这将获得相同的常数和输出

true

或者,您可以将"计算机软件"和添加"String"到常量池中,例如

String a = "计算机软件";
String b = "String";
String str1 = new StringBuilder("计算机").append("软件").toString();
System.out.println(str1.intern() == str1);

String str3 = new StringBuilder("Str").append("ing").toString();
System.out.println(str3.intern() == str3);

然后你会得到(与你的观察一致)

false
false
于 2016-03-17T14:35:02.817 回答