String 的不可變性

在貓眼的面試中被面試官問到爲何String的字符串是不變的。當時個人回答是由於String類是用final關鍵字修飾的,當被問到爲何用 final修飾就是不可變的時候我發現本身說的並無什麼道理。以後本身專門查了一下爲何。面試

String的不變性,以下圖所示,當你改變了s的以後s指向了一個新的對象原對象不作改變。數組

clipboard.png

看一下源碼是怎麼實現的:spa

clipboard.png

咱們看到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";

clipboard.png

相關文章
相關標籤/搜索