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

原文地址:https://www.cnblogs.com/xiaozhang666/p/12965045.html