参照
意思就是 如果常量池中 没有就会创建然后指向的是常量池,如果有就指向堆(前提是本身就是堆对象)
String a = new String(“1”) + “2”;
这种情况下a依旧是堆,此时堆中有"1"和“12”,常量池中有“1”,“2”,如果a.intern 那么返回的是常量池中的对象,因为常量池中没有"12"对象,要注意
String s = new String("1");String s2 = "1";s.intern();System.out.println(s == s2); // falseString s3 = "11";s3.intern();System.out.println(s3 == "11"); // trueSystem.out.println("++++++++++++++++");//1: 首先会在Heap中创建对象,然后在常量池中放入zhagnsan 和 wangwu ,但是并不会放入zhagnsanwangwuString a = new String("zhangsan") + "wangwu";// 2:调用 intern ,因为字符串常量池中没有”zhangsanwangwu”这种拼接后的字符串,所以将堆中String对象的引用地址添加到字符串常量池中。jdk1.7后常量池引入到了Heap中,所以可以直接存储引用String b = a.intern();// 3:因为 a 的地址和 b的地址一致,锁以是trueSystem.out.println(a == b);//4:因常量池中已经存在 zhangsanwangwu 了,所以直接返回引用就是 a 类型 a ==b 锁 a==b==cString c = "zhangsanwangwu";System.out.println(a == c); // trueSystem.out.println(b == c); // true// 5:首先会在Heap中创建对象,然后会在常量池中存储 zhang 和 sanString d = new String("zhang") + "san";// 6: 返回的是 常量池中的 地址,因在a变量时已经将 zhangsan 放入到了常量池中String f = d.intern();System.out.println(d == f); // false