阅读 63

String a = "abc"和String a = new String("abc")比较

  1. String a = "abc" 创建了0个或1个对象。
    首先在栈中定义一个引用变量a,检查字符串常量池中是否存在"abc",存在则直接指向"abc"的地址(指向的是字符串常量池中的地址),不存在则先在常量池中创建"abc"再指向其地址。

    常量池中不存在"abc"字符串:
    (1)在栈中创建3个char型字符'a','b','c'
    (2)在堆中new一个String对象,它的值是刚才在栈中创建的三个char型值组成的数组{'a','b','c'}
    (3)把这个String对象放进字符串常量池中,
    (4)将a指向这个对象在字符串常量池中的地址。

String a = "abc";等价于
char data[] = {'a', 'b', 'c'};String a = new String(data);

String a = "abc".png

  1. String a = new String("abc")创建了1个或者两个对象
    首先在栈中定义了一个引用变量a,然后在堆中new一个String对象,a指向这个对象,然后new出来的String对象再指向常量池中的abc。


    String a = new String("abc").png

  2. 比较

        String a = "abc";
        String b = "abc";
        String c = new String("abc");
        String d = new String("abc");
        System.out.println(a == b);
        System.out.println(a == c);
        System.out.println(c == d);

结果:true、false、false

new String("abc") 无论字符串常量池中是否存在“abc”,都会在堆中生成一个新的对象,c和d的引用指向各自堆的地址,堆引用才指向常量池。所以a、c、d三者不相等。



作者:糯米团子123
链接:https://www.jianshu.com/p/f68120bfbd72


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐