為什麼在 Java 中字符串是不可變的?

為什麼Java中的String是不可變的是一個常見的面試問題。String是任何編程語言中使用最多的類之一。我們知道String在Java中是不可變的和final的。Java運行時維護了一個字符串池,使其成為一個特殊的類。

為什麼Java中的String是不可變的?

讓我們來看看String不可變性的一些好處,這將有助於理解為什麼String在Java中是不可變的。

  1. 只有因為String在Java中是不可變的,所以才有了字符串池。這樣,Java運行時可以節省大量的堆空間,因為不同的String變量可以引用池中的同一個String變量。如果String是可變的,那麼字符串內部化就不可能實現,因為如果任何變量改變了值,它也會反映在其他變量中。
  2. 如果String不是不可变的,那麼它將對應用程序造成嚴重的安全威脅。例如,數據庫用戶名、密碼以String形式傳遞以獲取數據庫連接,在socket編程中主機和端口詳細信息也以String形式傳遞。由於String是不可變的,其值不能更改,否則任何黑客都可以更改引用值從而在應用程序中引發安全問題。
  3. 由於String是不可變的,它對於多線程是安全的。單個String實例可以在不同的線程之間共享。這樣可以避免使用同步來實現線程安全。字符串是隱式線程安全的。
  4. 字符串在Java類加載器中使用,不可變性提供了安全性,確保Classloader加載的是正確的類。例如,想像一個情況,你試圖加載java.sql.Connection類,但引用值被更改為myhacked.Connection類,這可能對你的數據庫造成不必要的影響。
  5. 由於String是不可變的,它的hashcode在創建時被緩存,不需要再次計算。這使得它成為Map中的理想鍵,其處理速度比其他HashMap鍵對象更快。這就是為什麼String被廣泛用作HashMap鍵的原因。

以上是我能想到的一些顯示字符串不可變性好處的原因。這是Java String類的一個很棒的特性,使其與眾不同。閱讀此文章以了解如何編寫您自己的不可變類

您可以從我們的GitHub存儲庫中查看更多Java字符串示例。

Source:
https://www.digitalocean.com/community/tutorials/string-immutable-final-java