String不可變:String值儲存在常量池中。一個已有字符串"abcd",若是改變值成"abcedl",不是在原內存地址上修改數據,而是在常量池中查找或生成這個新值,再把引用指向新值的地址,如圖: 數據庫
爲何不可變
- String 類自己是final的,不能夠被繼承
- String類內部經過private final char value[]實現,從而保證了引用的不可變和對外的不可見
- String內部經過良好的封裝,不去改變value數組的值
爲何要設計成不可變
1. 安全性
- 線程安全,不可變天生線程安全
- String常被用做HashMap的key,若是可變會引有安全問題,如兩個key相同
- String常被用做數據庫或接口的參數,可變的話也會有安全問題
2. 效率
- 經過字符串池能夠節省不少空間
- 每一個String對應一個hashcode,再次使用的話不用從新計算
擴展
能夠用反射來改變String中value的值,因此嚴格意義上說不必定不可變數組
參考資料
如何理解 String 類型值的不可變安全
解讀不可變的String線程