为什么String.intern()方法返回两个不同的结果?

时间:2016-03-17 14:25:30

标签: java string stringbuilder

我有这样的代码:

 public static void main(String[] args) {
    String str1 = new StringBuilder("计算机").append("软件").toString();
    System.out.println(str1.intern()==str1);

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

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


}

我有结果:

true
false
true

我能理解为什么line1和line3是真的,但我是关于line2的问题, 为什么这是假的?

我的java是:java版“1.8.0_73”

2 个答案:

答案 0 :(得分:15)

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

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

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

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

答案 1 :(得分: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