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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM