String 爲何要設計成不可變的

String不可變:String值儲存在常量池中。一個已有字符串"abcd",若是改變值成"abcedl",不是在原內存地址上修改數據,而是在常量池中查找或生成這個新值,再把引用指向新值的地址,如圖: 數據庫

爲何不可變

  1. String 類自己是final的,不能夠被繼承
  2. String類內部經過private final char value[]實現,從而保證了引用的不可變和對外的不可見
  3. String內部經過良好的封裝,不去改變value數組的值

爲何要設計成不可變

1. 安全性

  1. 線程安全,不可變天生線程安全
  2. String常被用做HashMap的key,若是可變會引有安全問題,如兩個key相同
  3. String常被用做數據庫或接口的參數,可變的話也會有安全問題

2. 效率

  1. 經過字符串池能夠節省不少空間
  2. 每一個String對應一個hashcode,再次使用的話不用從新計算

擴展

能夠用反射來改變String中value的值,因此嚴格意義上說不必定不可變數組

參考資料

如何理解 String 類型值的不可變安全

解讀不可變的String線程

相關文章
相關標籤/搜索