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

Tim*_*imi 9 java string stringbuilder string-interning

我有这样的代码:

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
Run Code Online (Sandbox Code Playgroud)

我有结果:

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
Run Code Online (Sandbox Code Playgroud)

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

我的java是:java版"1.8.0_73"

Pet*_*rey 17

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

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

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

注意:string.intern().equals(string)应该永远是真的.

  • *可以合理地假设在这种情况下,"java"已经存在于池中,所以当你调用intern()时它返回一个不同的对象,所以==是假的.*现在这对我有意义.谢谢! (3认同)
  • @李思聪在猜测,这个类是用来在启动时启动程序http://www.docjar.com/html/api/com/sun/tools/jdi/SunCommandLineLauncher.java.html和线125存在字符串文字`"java"` (2认同)