爲什麼 String 對象是不可變的

  • 字符串常量池之所以存在,就是因爲字符串在 Java 中是不可變的,不同的 String 變量可以引用池中的同一 String 變量, 也因此,Java 運行時環境節省了大量堆空間;如果 String 不是不可變的, 則字符串駐留(String interning)將是不可能的,因爲一旦任一變量更改所引用的String對象的值,它也會反映在其他變量中。

  • 如果字符串不是不可變的,那麼它可能會對應用程序造成嚴重的安全威脅。例如,數據庫用戶名和密碼都作爲 String 傳遞以獲取數據庫連接,Socket 編程的主機和端口信息也是如此。由於字符串是不可變的,因此其值不能被更改。否則,任何黑客都可以篡改其引用的值,這會導致應用程序中的安全問題。

  • 由於 String 是不可變的,因此它對與多線程處理來說是安全的,並且可以在不同的線程之間共享單個 String 實例。這避免了爲線程安全使用同步;字符串是隱式線程安全的。

  • 字符串被用在 Java 類加載器中,其不可變性爲類加載器加載正確的類提供了安全性。否則的話,請考慮這樣一個危險的情況,在你嘗試加載 java.sql.Connection 類時,你引用的值卻被更改爲 myhacked.Connection,並且它能對數據庫執行你不需要的操作。

  • 由於 String 是不可變的,因此在它被創建時其散列碼就被緩存,不需要再次計算。這使得它成爲映射中鍵的理想對象,它的處理速度比其他HashMap 鍵類型快。這就是爲什麼 String 是 HashMap 中最常用的鍵類型。

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

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