String 學習小結
摘要:
1. String 為什麼不可變?
String底層儲存字串的是“char[]”(JDK1.8之後改成了 byte[]),這個陣列被定義成了 final 型別,決定了 String 的物件例項只能初始化一次,但是這也只是保證了 String 的物件引用不能改變,不能保...
1. String 為什麼不可變?
- String底層儲存字串的是“char[]”(JDK1.8之後改成了 byte[]),這個陣列被定義成了 final 型別,決定了 String 的物件例項只能初始化一次,但是這也只是保證了 String 的物件引用不能改變,不能保證陣列內容不能改變。
final char[] value={"1","2","3"}; value[2]="4";//這時候數組裡已經{"1","2","4"}
- 底層儲存字串的陣列的訪問許可權修飾詞是 private,而且沒有提供對外暴露的 setter 和 getter 方法,保證了外部無法改變其內容。而且在整個 String 的方法中,也是小心翼翼的沒有改變陣列內容的地方。
- 整個類的修飾符是 final,保證 String 類不可被繼承,避免了子類繼承破壞定義。
綜上:String 的不可變,是因為其設計和實現如此,而不是單單因為底層的陣列被定義成了 final。
2. 為什麼要把 String 設計成不可變?
- 效能優化:在JDK1.7以前,字串常量池位於方法區內,而在JDK1.7及以後,字串常量池被轉移到堆內充當中。當建立一個String物件時,會優先查詢常量池中是否存在該字串常量,如果存在直接引用已經存在的物件。因為 String 在 JAVA 中的使用場景非常多,如果每次使用,都重新建立,即耗記憶體也耗時間,嚴格意義上來說是一種優化思想。
-
安全性:前面提到過,在 JAVA 語言中 String 可謂是最常用的類之一,經常被其他的類庫單做引數使用。
如果其內容是可變的,會帶來很多未知且不可控的問題。