Java StringBuilder是一個可變的、線程不安全的字元序列,它在內存中以可變的方式來維護它們,用於緩存字元串。 StringBuilder類沒有在實例化後重複創建一個新的對象,所以當需要進行多個字元串操作時它通常比String更加高效。
1. StringBuilder的背景信息
在Java String類中,字元串是不可變的對象,因此如果需要修改一個字元串,就需要創建一個新的String對象。這種機制可能會導致內存浪費和可維護性差的問題。Java StringBuilder為此而來。
StringBuilder提供了一種高效的字元串操作方式。使用StringBuilder可以避免在每次字元串操作時都重新創建一個新的String對象。它是自動擴容的,也可以手工調整其容量。其主要特點如下:
- StringBuilder對象的長度和內容可以修改
- StringBuilder對象可以在進行字元串操作時不需要額外開闢空間
- StringBuilder對象可以自由進行擴容,緩衝器與創建字元數組的效果類似
- StringBuilder對象可以直接和String對象進行互相轉換
2. StringBuilder的詳細闡述
一、StringBuilder與String的區別
StringBuilder對象可以在創建後進行內容的追加和修改,因此StringBuilder對象相關的API方法會比較多,而且在Java的API中,StringBuilder類和String類基本是對應的,兩者有很多相似的方法。
不僅如此, stringBuilder還有一些獨特的方法和屬性使它更加實用。例如,StringBuilder對象可以通過反向追加字元串來構造一個全新的字元串,這在某些情況下會更加高效。
二、StringBuilder容量和長度的關係
當創建一個StringBuilder時,它的默認容量為16個字元(如有需要可以通過構造函數指定容量大小)。如果需要在StringBuilder中添加的字元超出其當前容量,StringBuilder會自動進行擴容。擴容時,產生的新數組大小為原數組大小的2倍+2。
三、StringBuilder的方法
StringBuilder類中有很多方法可以對其進行操作,下面列舉幾個最常用的方法:
//構造函數 StringBuilder() //構造一個空的字元串構建器,容量為默認大小16 StringBuilder(CharSequence seq) //構造一個字元串構建器,該構建器包含與指定的CharSequence相同的字元 //添加方法,將string,char,StringBuilder對象或其它對象加入再修改文本 append(String str) //將指定字元串追加到此字元序列 append(char c) //將指定字元追加到此字元序列 append(StringBuffer sb) //將指定StringBuffer追加到此字元序列 append(CharSequence s) //將指定CharSequence追加到此字元序列 append(Object obj) //將指定對象的字元串表示形式追加到此字元序列 append(StringBuilder sb) //將指定StringBuilder追加到此字元序列 append(CharSequence s, int start, int end) //將指定CharSequence的子序列追加到此字元序列 //插入方法,在任意位置插入新的文本 insert(int offset, String str) //將指定字元串插入此字元序列中 insert(int offset, CharSequence s) //將指定CharSequence插入此字元序列中 insert(int dstOffset, CharSequence s, int start, int end) //將指定CharSequence字元子集插入此字元序列 insert(int offset, boolean b) //將boolean參數插入此字元序列 insert(int offset, char c) //將char參數插入此字元序列中 insert(int offset, int i) //將int參數插入此字元序列中 insert(int offset, long l) //將long參數插入此字元序列中 insert(int offset, float f) //將float參數插入此字元序列中 insert(int offset, double d) //將double參數插入此字元序列中
3. StringBuilder小標題
1. StringBuilder與String的性能對比
在進行多次追加操作時,如果使用String對象進行操作,就需要每次創建一個新的對象。這樣的話,在容量可預估的情況下,可以使用StringBuilder進行初始化,可以在程序的初始執行期就分配足夠的內存以避免重新分配內存。
示例代碼:
public static void main(String[] args) { //使用String long startTime = System.currentTimeMillis(); String s = ""; for (int i = 0; i < 10000; i++) { s += i; } long endTime = System.currentTimeMillis(); System.out.println("String time cost: " + (endTime - startTime) + "ms"); //使用StringBuilder startTime = System.currentTimeMillis(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < 10000; i++) { sb.append(i); } endTime = System.currentTimeMillis(); System.out.println("StringBuilder time cost: " + (endTime - startTime) + "ms"); }
輸出結果:
String time cost: 38ms
StringBuilder time cost: 1ms
從上述代碼和結果可知,使用StringBuilder進行字元串追加的效率要大大高於使用String。因此,在處理字元序列時,如果需要對其進行多次操作,則應優先考慮使用StringBuilder。
2. StringBuilder的線程安全問題
在單一線程環境下,StringBuilder比StringBuffer要快很多,但是在多線程的情況下StringBuilder是線程不安全的。
如果需要在多線程環境下使用StringBuilder,可以使用java.util.concurrent.atomic.AtomicReference,java.util.concurrent.atomic.AtomicLongFieldUpdater等線程安全類來進行替代實現。
3. StringBuilder的容量和長度的控制
StringBuilder默認的初始化容量為16個字元,如果在使用時發現StringBuilder未參考原始字元串的容量進行設定初始化容量,則每次進行擴容的時候都會重新申請新的內存空間對象,這樣的開銷將越來越大,直到StringBuilder的長度超過需要的字元串長度,擴容次數達到一定數量後,StringBuilder操作效率將直線下降。
因此,在使用StringBuilder時,如果提前知道字元串的長度,可以使用構造函數或者.ensureCapacity()方法對容量進行初始化。
StringBuilder sb1 = new StringBuilder(); //默認容量16 StringBuilder sb2 = new StringBuilder(32); //容量為32 sb1.ensureCapacity(64); //容量是64
4. 總結
StringBuilder是Java中十分優秀的字元串處理類,可以在性能和便捷性兩個方面都擁有優勢。在進行大批量字元串處理時,StringBuilder往往比原來的String類更加方便,也可以提高效率。但在多線程環境下需要考慮線程安全的問題,如果需要對文本進行手動操作,可以需要考慮容量和長度的問題。為了提高代碼的可讀性和易維護性,在開發時應當合理運用StringBuilder的所有方法,,從而使代碼的質量更高,效率更高。
原創文章,作者:WBYV,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/132394.html