為什麼String類是不可變的?

來源:互聯網
上載者:User

標籤:不可   不可變   heap   使用字串   字串   hash   不能   ash   cti   

Java在運行時儲存了一個字串池(String pool),這使得String成為了一個特別的類。

String類不可變性的好處

  (1)只有當字串是不可變的,字串池才有可能實現。字串池的實現可以在運行時節約很多heap空間,因為不同的字串變數都指向池中的同一個字串。但如果字串是可變的,那麼String interning將不能實現(譯者註:String interning是指對不同的字串僅僅只儲存一個,即不會儲存多個相同的字串。),因為這樣的話,如果變數改變了它的值,那麼其它指向這個值的變數的值也會一起改變

  (2)如果字串是可變的,那麼會引起很嚴重的安全問題。譬如,資料庫的使用者名稱、密碼都是以字串的形式傳入來獲得資料庫的串連,或者在socket編程中,主機名稱和連接埠都是以字串的形式傳入。因為字串是不可變的,所以它的值是不可改變的,否則駭客們可以鑽到空子,改變字串指向的對象的值,造成安全性漏洞。

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

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

  (4)因為字串是不可變的,所以在它建立的時候hashcode就被緩衝了,不需要重新計算。這就使得字串很適合作為Map中的鍵,字串的處理速度要快過其它的鍵對象。這就是HashMap中的鍵往往都使用字串。

為什麼String類是不可變的?

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.