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池中的字符串

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章