JAVA 中為什么String 是immutable的


本文翻譯自: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面試中一些“為什么”的答案。

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM