String s1 = new String("1") + new String("1");
s1.intern();
String s2 = "11";
System.out.println(s1 == s2);//jdk6:false;jdk7:true;jdk8:true;jdk17:false
上面同样的代码在jdk6中为false,但在jdk7和jdk8中为true,在jdk17中为false。这是为什么?
我想知道这里发生了什么变化
Java 版本之间的变化并不是
String.intern()
的行为。 Java 版本之间的变化是在字符串池中查找字节码中引用的字符串常量的时间点(如果找不到,则将其添加到字符串池中)。
在某些 Java 版本中,类加载和初始化时,类中引用的所有字符串都会在字符串池中查找(如果不包含这些字符串,则添加到字符串池中)。
在某些 Java 版本中,在方法开始执行之前,会在字符串池中查找调用的方法中引用的所有字符串(如果不包含这些字符串,则将其添加到字符串池中)。
在某些 Java 版本中,仅当在方法执行期间需要引用该字符串时,才会在字符串池中查找字符串(如果不包含该字符串,则将其添加到字符串池中)。