public static void main(String[] args) { String a1 = new String("1") + new String("1"); a1.intern(); String b1 = "11"; System.out.println(a1 == b1); System.out.println(Integer.toHexString(System.identityHashCode(a1)) + "---" + Integer.toHexString(System.identityHashCode(b1))); String a2 = new String("11"); a2.intern(); String b2 = "11"; System.out.println(a2 == b2); System.out.println(Integer.toHexString(System.identityHashCode(a2)) + "---" + Integer.toHexString(System.identityHashCode(b2))); }
执行结果
true 6a6824be---6a6824be false 5c8da962---6a6824be
说明:
一、
new String("1") + new String("1") 相当于 new String(new char[]{'1','1'}); 所以产生了一个char数组对应的字符串对象“11”
intern()的作用是:如果字符串s在字符串常量池中存在对应字面量,则intern()方法返回该字面量的地址;如果不存在,则创建一个对应的字面量,并返回该字面量的地址
此时静态常量池中不存在"11",所以将a1的地址同步到静态常量池中
当b1="11"时,新建了一个指向"11"的引用b1 所以b1=a1
二、
new String("11") 相当于先在静态常量池中创建了对象"11",然后基于静态常量池中"11"对象新生成了一个对象,并将a2指向新对象
此时静态常量池中存在"11",所以intern()没有效果
当b2 = "11"时,新建了一个指向"11"的引用b2,所以指向"11"的引用b2和新生成的对象a2不相等,b2!=a2