本文翻譯自:http://www.programcreek.com/2013/04/why-string-is-immutable-in-java/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緩存它的hashcodepost
String的hashcode在JAVA中是使用很是頻繁的。例如在HashMapzhong, String設計成immutable保證了hashcode老是同樣的,因此hashcode能夠被緩存而不用擔憂改變。也就是說,不須要每次在使用hashcode時都去計算一遍,這樣更高效。this
在String類裏,代碼:spa
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面試中一些「爲何」的答案。
歡迎關注微信公衆號:shoshana