這是一個古老但仍然流行的問題。Java中字串被設計成不可變的,有多種原因。很好的答案取決於你對記憶體,同步,資料結構等更好的理解,下面,我總結一些答案。
1.String Pool中的要求
字串池在方法區(Method Area)中是一種特殊的儲存地區。當建立一個字串時,如果字串已經存在於池中,現有字串的引用將被退回,而不是建立一個新的對象並返回其引用。
下面的代碼將在堆中只會建立一個字串對象。
String string1 = "abcd";String string2 = "abcd";
在堆中就是這樣的:
如果字串不是一成不變的,在只有一個引用下不斷變化的字串將導致對其他引用取得錯誤的值。
2.允許字串來緩衝其雜湊碼
在Java中字串的雜湊碼常被用到。例如,在HashMap中不可變保證了雜湊碼將永遠是相同的,因此,完全不用擔心字串的變化實現這個不可變的特性,這意味著,每次被用時沒必要去計算其雜湊碼,所以,這更有效。
在String類,類中有如下代碼:
private int hash;//this is used to cache hash code.
3.安全性
字串為許多Java類被廣泛用作參數,如網路連接,開啟檔案等,如果字串是可變的,則串連,開啟檔案將會被改變並會導致嚴重的安全威脅。該方法還以為是串連到一台機器上,但事實並非如此。可變字串在反射機制中同樣能引起安全性問題,因為這些參數都是字串。
下面是一段程式碼範例:
boolean connect(string s){ if (!isSecure(s)) { throw new SecurityException(); } //here will cause problem, if s is changed before this by using other references. causeProblem(s);}
綜上所述,原因包括設計,效率和安全性。其實,這也適用於在Java面試中許多其他“為什麼”問題。
原文: Why string is immutable in Java ?