本文翻譯自:http://www.programcreek.com/2013/04/why-string-is-immutable-in-java/
這是一個很老但很流行的問題,這里有幾個原因String在java中被設計成immutable的。對內存、同步、數據結構等有好的理解,能更好的回答這個問題。下面我將簡單的介紹這些原因:
1, String Pool的需要。
String pool(String intern pool) 是一個方法區里的特殊的存儲區域。當創建一個String, 如果它已經在pool中存在,則會返回一存在String的引用,相反,怎會創建一個新的String,並返回該引用。
下面的代碼將僅僅在堆中創建一個String對象。
String string1 = "abcd";
String string2 = "abcd";
如圖:

如果String不是immutable的,改變String的一個引用將導致另一個引用的到錯誤的值
2. 允許String緩存它的hashcode
String的hashcode在JAVA中是使用非常頻繁的。例如在HashMapzhong, String設計成immutable保證了hashcode總是一樣的,所以hashcode可以被緩存而不用擔心改變。也就是說,不需要每次在使用hashcode時都去計算一遍,這樣更高效。
在String類里,代碼:
private int hash;//this is used to cache hash code.
3. 安全
String廣泛的作為參數被JAVA中的類使用,比如 網絡連接,打開的文件等等,如果String不是immutable,一個連接或文件的改變將導致嚴重的安全威脅,一個方法還以為正連接到一個機器上,並其實沒有。可變的String同樣將導致反射的安全性問題,因為反射中的參數都是String類型的。
代碼:
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面試中一些“為什么”的答案。
