JAVA 中爲何String 是immutable的

 

本文翻譯自: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

相關文章
相關標籤/搜索