new String("abc") 和 String ="abc"的分析

public static void main(String[] args){
        String str1 = new String("abc") + new String("abc");//类加载时:1.在堆开辟内存保存abcabc的 2.在堆开辟内存 保存abc 运行时在池中保存abc
        str1.intern();//判断池中有没有abcabc 有则不管 没有则创建一个代理指向 堆中存放 abcabc的内存地址
        String str2 = "abcabc"; //查找池中有没有abcabc有则直接指向它或它所保存的地址
        System.out.println(str1 == str2);//true str1和str2都是指向同一个内存地址(都在堆内存中)

        String str3 = new String("abcd") + new String("abcd");//1.在堆开辟内存保存abcdabcd 2.在堆开辟内存 保存abcd 运行时在池中保存abcd
        String str4 = "abcdabcd";//池中没有abcdabcd 所以自己在池中创建并指向该内存地址
        str3.intern();//池中已有abcdabcd 所以什么都不做
        System.out.println(str3 == str4);//false str3指向了堆中的abcdabcd str4指向了池中的abcdabcd 地址不同所以false
    }

总结 : 1.new 是在堆中开辟内存空间保存数据 并且在运行时才会把数据保存到池中 而 String s = “” 则是在池中开辟空间保存数据 ;2.intern 只是判断池中有没有该字符串 有则不管 没有则创建一个“代理”指向堆空间的 该字符串的内存地址空间

猜你喜欢

转载自blog.csdn.net/v2020877/article/details/82386307