String, StringBuffer,StringBuilder的區別和原理

(一) String 

String 對象一旦創建,其值是不能修改的,如果要修改,會重新開闢內存空間來存儲修改之後的對象,即修改了 String 的引用。 

因爲 String 的底層是用數組來存值的,數組長度不可改變這一特性導致了上述問題。

‌如果我們在實際開發過程中需要對某個字符串進行頻繁的修改,使用 String 就會造成內存空間的浪費,應該怎樣解決這個問題呢?‌

答案就是可以使用 StringBuffer 來解決這個問題。

(二)​  StringBuffer:

 ‌ ​StringBuffer 和 String 類似,底層也是用一個數組來存儲字符串的值,並且數組的默認長度爲 16,即一個空的 StringBuffer 對

象,數組長度爲 16。實例化一個 StringBuffer 對象即創建了一個大小爲 16 個字符的字符串緩衝區。

但是​當我們調用有參構造函數創建一個 StringBuffer 對象時,數組長度就不再是 16 了,而是根據當前對象的值來決定數組的長

度,數組的長度爲“當前對象的值的長度+16”。

所以一個 StringBuffer 創建完成之後,有 16 個字符的空間可以對其值進行修改。如果修改的值範圍超出了 16 個字符,會先檢查

StringBuffer 對象的原 char 數組的容量能不能裝下新的字符串,如果裝不下則會對 char 數組進行擴容。

那StringBuffer是怎樣進行擴容的呢?

擴容的邏輯就是創建一個新的 char 數組,將現有容量擴大一倍再加上2,如果還是不夠大則直接等於需要的容量大小。擴容

完成之後,將原數組的內容複製到新數組,最後將指針指向新的 char 數組。

( 三 ) StringBuilder

StringBuilder 和 StringBuffer 擁有同一個父類 AbstractStringBuilder,同時實現的接口也是完全一樣,都實現了

java.io.Serializable, CharSequence 兩個接口。

那它倆有什麼區別呢?

最大的區別在於 StringBuffer 對幾乎所有的方法都實現了同步,線程比較安全,在多線程系統中可以保證數據同步;

而StringBuilder 沒有實現同步,線程不安全,在多線程系統中不能使用 StringBuilder。

StringBuffer 和StringBuilder 的使用場景:

當需要考慮線程安全的場景下使用 StringBuffer,如果不需要考慮線程安全,追求效率的場景下可以使用 StringBuilder。
 

發佈了15 篇原創文章 · 獲贊 3 · 訪問量 1215
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章