首先我們先來談談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 數組。
接下來看StringBuffer的兄弟-StringBuilder
StringBuilder 和StringBuffer 擁有同一個父類別AbstractStringBuilder,同時實作的介面也是完全一樣,都實作了
java.io.Serializable, CharSequence 兩個介面。
那它兩個有什麼差別呢?
最大的差異在於StringBuffer 對幾乎所有的方法都實現了同步,執行緒比較安全,在多執行緒系統中可以保證資料同步;
而StringBuilder 沒有實現同步,線程不安全,在多線程系統中不能使用StringBuilder。
StringBuffer 和StringBuilder 的使用場景:
當需要考慮線程安全的場景下使用StringBuffer,如果不需要考慮線程安全,追求效率的場景下可以使用StringBuilder。
以上是Java之String、StringBuffer和StringBuilder的差別與原理的詳細內容。更多資訊請關注PHP中文網其他相關文章!