在貓眼的面試中被面試官問到爲何String
的字符串是不變的。當時個人回答是由於String
類是用final
關鍵字修飾的,當被問到爲何用 final
修飾就是不可變的時候我發現本身說的並無什麼道理。以後本身專門查了一下爲何。面試
String
的不變性,以下圖所示,當你改變了s
的以後s
指向了一個新的對象原對象不作改變。數組
看一下源碼是怎麼實現的:spa
咱們看到String被定義爲final,因此說String是不可繼承的,接着咱們看到String的內部實現是一個char數組,而且定義爲final。這時有些人可能認爲final修飾的字段建立之後就不可改變,因此就完了,但其實不是這樣的。設計
由於雖然value是不可變,也只是value這個引用地址不可變。但其引用的Array數組是可變的。code
final int[] value={1,2,3}; value[2]=100; //這時候數組裏已是{1,2,100}
因此根本上String是不可變的緣由是sun工程師很好的封裝了value數組,在其中全部的方法中不去更改value數組,並把它定義爲private,而且把整個String設成final禁止繼承,避免被其餘人繼承後破壞。因此String的不可變性的關鍵並非final的做用。對象
同時Java編寫者爲了不由於String的不可變性致使佔用大量空間,爲此設計了字符串常量池繼承
String one = "someString"; String two = "someString";