Java面試之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 數組。

 

接下來看StringBuffer的兄弟——StringBuilder

StringBuilder 和 StringBuffer 擁有同一個父類 AbstractStringBuilder,同時實現的接口也是完全一樣,都實現了java.io.Serializable, CharSequence 兩個接口。

 

那它倆有什么區別呢?

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

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

 

StringBuffer 和StringBuilder 的使用場景

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


—————————————

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM