Java中String類不可變性的好處
String是所有語言中最常用的一個類。我們知道在Java中,String是不可變的、final的。Java在執行時也儲存了一個字串池(String pool),這使得String成為了一個特別的類。
String類不可變性的好處
- 只有當字串是不可變的,字串池才有可能實現。字串池的實現可以在執行時節約很多heap空間,因為不同的字串變數都指向池中的同一個字串。但如果字串是可變的,那麼String interning將不能實現(譯者注:String interning是指對不同的字串僅僅只儲存一個,即不會儲存多個相同的字串。),因為這樣的話,如果變數改變了它的值,那麼其它指向這個值的變數的值也會一起改變。
- 如果字串是可變的,那麼會引起很嚴重的安全問題。譬如,資料庫的使用者名稱、密碼都是以字串的形式傳入來獲得資料庫的連線,或者在socket程式設計中,主機名和埠都是以字串的形式傳入。因為字串是不可變的,所以它的值是不可改變的,否則黑客們可以鑽到空子,改變字串指向的物件的值,造成安全漏洞。
- 因為字串是不可變的,所以是多執行緒安全的,同一個字串例項可以被多個執行緒共享。這樣便不用因為執行緒安全問題而使用同步。字串自己便是執行緒安全的。
- 類載入器要用到字串,不可變性提供了安全性,以便正確的類被載入。譬如你想載入java.sql.Connection類,而這個值被改成了myhacked.Connection,那麼會對你的資料庫造成不可知的破壞。
- 因為字串是不可變的,所以在它建立的時候hashcode就被快取了,不需要重新計算。這就使得字串很適合作為Map中的鍵,字串的處理速度要快過其它的鍵物件。這就是HashMap中的鍵往往都使用字串。
相關文章
- Java中建立不可變的類Java
- Java 中的 String 為什麼是不可變的?Java
- 【Java系列】從JVM角度解析Java核心類String的不可變特性JavaJVM
- 集合類再探:不可變類的好處,Collector介面詳解,使用內部迭代
- java基礎鞏固-淺析String原始碼及其不可變性Java原始碼
- [Java基礎]String 為什麼是不可變的?Java
- 你有沒有想過: 為什麼Java中String是不可變的?Java
- 【JDK原始碼分析】String的儲存區與不可變性JDK原始碼
- 通過String的不變性案例分析Java變數的可變性Java變數
- 不可變類
- Java中String類的常用方法Java
- Java中實現不可變MapJava
- java 中構建不可變物件Java物件
- Java中String類的初始化?Java
- Java中的不可變資料結構Java資料結構
- 深入理解Java中的不可變物件Java物件
- Java中如何快捷的建立不可變集合Java
- Java 10中Stream API不可變集合JavaAPI
- Java String類Java
- Java中變數之區域性變數、本類成員變數、父類成員變數的訪問方法Java變數
- Java String類的replaceAll方法Java
- java中String類常用方法的使用與例項Java
- Java使用類-StringJava
- Java中的不可變集合,我們換個方式理解!!!Java
- Java中的不可變資料結構 - Jworks.ioJava資料結構
- Java™ 教程(不可變物件)Java物件
- java中的StringJava
- JAVA基礎:使用Properties類帶來的好處(轉)Java
- React專題:不可變屬性React
- Dart4Flutter – 不可變性DartFlutter
- Dart4Flutter - 不可變性DartFlutter
- ant如何替換JAVA程式碼中的String變數中的值?Java變數
- Python中的不可變集合Python
- Java中String.format變得更快 - MilošJavaORM
- Java新人之路 -- String類Java
- java String類說明Java
- java string類 基本操作Java
- 實現不可變類如何禁止子類化?