論String 在 Java 中是不可變的的原因分析

一些面試者也常問這個問題,爲什麼 String 在 Java 中是 final 的。

論String在 Java 中是不可變的的原因:

  1. 想象字符串池沒有使字符串不可變,它根本不可能,因爲在字符串池的情況下,一個字符串對象/文字,例如 “Test” 已被許多參考變量引用,因此如果其中任何一個更改了值,其他參數將自動受到影響,即假設

    String A="Test";
    String B="Test";
    

    現在字符串 B 調用 “Test”.toUpperCase(), 將同一個對象改爲“TEST”,所以 A 也是 “TEST”,這不是期望的結果。

  2. 字符串已被廣泛用作許多 Java 類的參數,例如,爲了打開網絡連接,你可以將主機名和端口號作爲字符串傳遞,你可以將數據庫 URL 作爲字符串傳遞, 以打開數據庫連接,你可以通過將文件名作爲參數傳遞給 File I/O 類來打開 Java 中的任何文件。如果 String 不是不可變的,這將導致嚴重的安全威脅,我的意思是有人可以訪問他有權授權的任何文件,然後可以故意或意外地更改文件名並獲得對該文件的訪問權限。由於不變性,你無需擔心這種威脅。這個原因也說明了,爲什麼 String 在 Java 中是最終的,通過使 java.lang.String final,Java設計者確保沒有人覆蓋 String 類的任何行爲。

  3. 由於 String 是不可變的,它可以安全地共享許多線程,這對於多線程編程非常重要. 並且避免了 Java 中的同步問題,不變性也使得String 實例在 Java 中是線程安全的,這意味着你不需要從外部同步 String 操作。關於 String 的另一個要點是由截取字符串 SubString 引起的內存泄漏,這不是與線程相關的問題,但也是需要注意的。

  4. 爲什麼 String 在 Java 中是不可變的另一個原因是允許 String 緩存其哈希碼,Java 中的不可變 String 緩存其哈希碼,並且不會在每次調用 String 的 hashcode 方法時重新計算,這使得它在 Java 中的 HashMap 中使用的 HashMap 鍵非常快。簡而言之,因爲 String 是不可變的,所以沒有人可以在創建後更改其內容,這保證了 String 的 hashCode 在多次調用時是相同的。

  5. String 不可變的絕對最重要的原因是它被類加載機制使用,因此具有深刻和基本的安全考慮。如果 String 是可變的,加載“java.io.Writer” 的請求可能已被更改爲加載 “mil.vogoon.DiskErasingWriter”. 安全性和字符串池是使字符串不可變的主要原因。順便說一句,上面的理由很好回答另一個Java面試問題: “爲什麼String在Java中是最終的”。要想是不可變的,你必須是最終的,這樣你的子類不會破壞不變性。

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