標籤:map 安全性 方法 pool 安全執行緒 hashcode 網路連接 比較 使用
JAVA
中為什麼
String
是
immutable
的
?
1.設計:當建立一個String(String str2 = "abc"), 如果它(原先有一個String str = "abc")已經在pool(其實是記憶體中的棧)中存在,則會返回已存在String的引用,相反,怎會建立一個新的String,並返回該引用。如果String不是immutable的,改變String的一個引用將導致另一個引用的到錯誤的值。
2.效率:允許String緩衝它的hashcode。String的hashcode在JAVA中是使用非常頻繁的。例如在HashMapzhong, String設計成immutable保證了hashcode總是一樣的,所以hashcode可以被緩衝而不用擔心改變。也就是說,不需要每次在使用hashcode時都去計算一遍,這樣更高效。
3. 安全:String廣泛的作為參數被JAVA中的類使用,比如 網路連接,開啟的檔案等等,如果String不是immutable,一個串連或檔案的改變將導致嚴重的安全威脅,一個方法還以為正串連到一個機器上,並其實沒有。可變的String同樣將導致反射的安全性問題,因為反射中的參數都是String類型的。
【附】
String
,
StringBuffer
,
StringBuilder
三者在執行速度方面的比較:StringBuilder > StringBuffer > String
String:字串常量 StringBuffer:字串變數 StringBuilder:字串變數
從上面的名字可以看到,String是常量, 而StringBuffer與StringBuilder就不一樣了,他們是字串變數,是可改變的對象,每當我們用它們對字串做操作時,實際上是在一個對象上操作的,這樣就不會像String一樣建立一些而外的對象進行操作了,當然速度就快了。再有,StringBuilder是線程非安全的,而StringBuffer是安全執行緒的,所以StringBuilder速度最快。
學習一下Java的String(轉)