• String的==比较


        首先看几条代码

                

        一、我们可以先猜测,String在new的时候会先去String池中查询,如果查找到就会返回该String池中的数据,否则就会重新创建一个对象并且放入String中,那么按照这个猜测,上面的就应该都是true(如果真的是这样那么这个问题就没有什么意义了,但是意见还是可以保留的)

        二、我们可以再猜测一下,String是否会new一个新的对象的时候,返回不一样的地址

            那么根据我们的猜想

                1、第一个应该是true,也就是说,a是new了一个对象,并将对象存储到String池中,然后b是将指针指向a,a又是指向String池中的数据

                2、第二个也应该是true,同样的c将指针指向b,而b又是指向的a指向的String对象

                3、第三个应该是true,d去String中寻找String对象,找到a当初存储的String对象,并将指针指向它

                4、第四个应该是false,按照我们的猜想,当new一个新的对象的时候,会返回不一样的指针地址

                5、第五个应该是true,按照上面的应该可以理解,b和c都是指向String池中的值

                剩下的我就不分析了,大家应该根据这个猜测可以分析出来

                6、true    7、false    8、true    9、false    10、false

        我们来看看结果到底是什么样子的

        

        一眼望过去都是false,我们先来看看第三个,应该就是true啊,为什么会是false嘞,分析了半天源码也没有分析出来什么鬼,还是看了大佬的博客以后我才知道,原来当new一个String对象的时候,会先去String池中先找有没有相同的字符串,如果有,那么就会生成一个对象指向这个字符串,但是后面运行到new的时候,不管String中有没有该字符串,都会直接生成一个对象,然后返回该对象指针所指地址的字符串,也就是生成了一个或两个对象,而我们所比较的那个对象,正好就是new的时候返回的那个,也就是地址是不相同的

        虽然我们其他的判断正确了,但是分析的却有问题,因为new返回的指针指向的并不是String池中的对象,而是堆中的

        那么剩下的应该就能理解了,因为当你new完对象,并将该对象赋值到其他的对象的时候,其实指向的都是堆中的字符串,而不是String池中的字符串
    ————————————————
    版权声明:本文为CSDN博主「MrLi_IT」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/MrLi_IT/java/article/details/89453881

  • 相关阅读:
    C#读写XML no
    ComboBox、ListBox绑定和获取数据 no
    win7 安装oracle 11g no
    2011没有惊天动地 no
    Oracle 删除重复数据只留一条 no
    Oracle 创建用户并分配权限 no
    Oracle 导出、导入某用户所有数据(包括表、视图、存储过程...) no
    谢谢,博客园这么快就审批通过了我的申请!
    Eclipse 中 JAVA AWT相关包不提示问题(解决)
    Eclipse java项目转Maven项目
  • 原文地址:https://www.cnblogs.com/xiaozhang666/p/12965045.html
Copyright © 2020-2023  润新知