String StringBuilder 常量池一点说明

看下下边这份代码,这段代码执行结果为 :true false,抛个问题这是为什么呢?

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

按说这段代码应该返回结果是相同的;
解释下:“new StringBuilder(“计算机”).append(“软件”)”这段代码会将“计算机” “软件”作为常量添加到方法区的常量池中,只有“new StringBuilder(“计算机”).append(“软件”).toString()”这段代码执行结束后才会将“计算机软件”添加到常量池;JDK 7以上(以及部分其他虚拟机,例如 JRockit)的 intern()方法实现就不需要再拷贝字符串的实例到永久代了,既然字符串常量池已经移到 Java 堆中,那只需要在常量池里记录一下首次出现的实例引用即可,因此 intern()返回的引用和由 StringBuilder 创建的
那个字符串实例就是同一个。而对 str2 比较返回 false,这是因为“java”[2]这个字符串在执行 String-Builder.toString()之前就已经出现过了,字符串常量池中已经有它的引用,不符合 intern()方法要求“首次遇到”的原则,“计算机软件”这个字符串则是首次出现的,因此结果返回 true。

你可能感兴趣的:(python,开发语言)