爲什麼string是不可變的

這只是對原文章的一個簡單翻譯和總結,建議看原文章:

http://www.programcreek.com/2013/04/why-string-is-immutable-in-java/

1、字符串池的要求

字符串池在Java堆內存中一塊特殊的內存區域,當要新建一個字符串時,系統會檢查字符串中是否存在要創建的字符串,如果存在就把引用直接傳遞給新的String對象,如果不存在,纔會在字符串中新建一個字符串。

下面的代碼實際上在堆內存中只創建了一個string 對象

String string1 = "abcd";
String string2 = "abcd";

他看起來就像這樣:



所以如果一個string是可變的,當改變一個內容的值時,就會對其他的引用有影響。

2、允許字符串緩存其Hashcode

字符串 的hashcode在Java中被經常使用,例如HashMap。成爲不可變得,保證了他的hashcode一直是一樣的,所以不用擔心他的變化。那就意味着沒有必要當每次使用它時都計算hashcode

3、安全

在java類裏,String被廣泛用做參數,例如:網絡連接、打開文件等等。如果String是可變的,一個連接或者是文件就會發生改變,導致嚴重安全威脅。這個方法可能會認爲它是一臺機器的連接,但是不是。當參數都是字符串時,可變的string在放射也可能會導致嚴重的安全性問題。

總的來說,這些原因包括設計方面、效率、安全方面。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章