這篇文章主要介紹Java之String、StringBuffer和StringBuilder的區別有哪些,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
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的區別有哪些的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。