String類可變是真的嗎?N絲9772019-04-11 22:09:01

String是所有語言中最常用的一個類。我們知道在Java中,String是不可變的、final的。Java在執行時也儲存了一個字串池(String pool),這使得String成為了一個特別的類。

String類不可變性的好處

1。只有當字串是不可變的,字串池才有可能實現。字串池的實現可以在執行時節約很多heap空間,因為不同的字串變數都指向池中的同一個字 符串。但如果字串是可變的,

那麼String interning將不能實現(譯者注:String interning是指對不同的字串僅僅只儲存一個,即不會儲存多個相同的字串。),因為這樣的話,如果變數改變了它的值,那麼

其它指向這個值的變數 的值也會一起改變。

2。如果字串是可變的,那麼會引起很嚴重的安全問題。譬如,資料庫的使用者名稱、密碼都是以字串的形式傳入來獲得資料庫的連 接,或者在socket程式設計中,主機名和埠都是以字

符串的形式傳入。因為字串是不可變的,所以它的值是不可改變的,否則駭客們可以鑽到空子,改變字元 串指向的物件的值,造成安全漏洞。

3。因為字串是不可變的,所以是多執行緒安全的,同一個字串例項可以被多個執行緒共享。這樣便不用因為執行緒安全問題而使用同步。字串自己便是執行緒安全的。

4。類載入器要用到字串,不可變性提供了安全性,以便正確的類被載入。譬如你想載入java。sql。Connection類,而這個值被改成了myhacked。Connection,那麼會對你的資料庫造成

不可知的破壞。

5。因為字串是不可變的,所以在它建立的時候hashcode就被快取了,不需要重新計算。這就使得字串很適合作為Map中的鍵,字串的處理速度要快過其它的鍵物件。這就是HashMap

中的鍵往往都使用字串。