public class Test { public static void main(String[] args) { String s = new String("1"); s.intern();//调用此方法之前,字符串常量池中就有“1” String s1 ="1"; System.out.println(s == s1); //jdk6:false jdk7/8:false String s2 =new String("1")+new String("2"); s2.intern(); //调用该方法之前,字符串常量池中没有"12".使用该方法就强制在字符串常量池中生成"12" //因为上面的拼接最后在堆中new String("12").生成这个对象的字符串常量对象时,生成的方式随着版本的不同有所改变 //jdk6是真实的在字符串常量池中创建一个对象"12"。jdk7之后就是引用堆中的new String("12")的地址 //造成这个原因也是因为字符串常量池在jdk7之后从方法区放到堆空间中的原因 String s3 = "12"; System.out.println(s2 == s3);//jdk6:false jdk7/8:true } }