String類型爲什麼被設置爲finall

String爲什麼不可變?


public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
    /** String本質是個char數組. 而且用final關鍵字修飾.*/
    private final char value[];
	...
	...
}

首先String類是用final關鍵字修飾,這說明String不可繼承。再看下面,String類的主力成員字段value是個char[ ]數組,而且是用final修飾的。final修飾的字段創建以後就不可改變。因爲雖然value是不可變,也只是value這個引用地址不可變。擋不住Array數組是可變的事實。private使我們訪問不到這個value數組。所以String是不可變的關鍵都在底層的實現,而不是一個final。

不可變有什麼好處?

  1. 爲了實現字符串池
    只有當字符串是不可變的,字符串池纔有可能實現。字符串池的實現可以在運行時節約很多heap空間,因爲不同的字符串變量都指向池中的同一個字符串。但如果字符串是可變的,那麼String interning將不能實現,因爲這樣的話,如果變量改變了它的值,那麼其它指向這個值的變量的值也會一起改變。
  2. 爲了線程安全
    因爲字符串是不可變的,所以是多線程安全的,同一個字符串實例可以被多個線程共享。這樣便不用因爲線程安全問題而使用同步。字符串自己便是線程安全的。
  3. 爲了實現String可以創建HashCode不可變性
    因爲字符串是不可變的,所以在它創建的時候HashCode就被緩存了,不需要重新計算。這就使得字符串很適合作爲Map中的鍵,字符串的處理速度要快過其它的鍵對象。這就是HashMap中的鍵往往都使用字符串。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章