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

  

posted on 2023-01-05 17:25  程序员丁先生  阅读(22)  评论(0编辑  收藏  举报