Java - StringBuffer, StringBuilder

By sunwc 2023-03-26 Java

String:不可變的 CharSequence

StringBuffer:可變的 CharSequence、且thread-safety,所以效率較低

StringBuilder:可變的 CharSequence、thread-safety,所以效率較高

執行效率:StringBuilder > StringBuffer > String

JDK source code 分析

String str = new String(); // new char[0];

String str1 = new String("abc"); // new char[]{'a','b','c'};

// 底層創建了一個空間16的陣列
StringBuffer sb1 = new StringBuffer(); // new char[16];
sb1.append('a'); // value[0] = 'a';
sb1.append('b'); // value[1] = 'b';

StringBuffer sb2 = new StringBuffer("abc"); // char[] value = new char["abc".length()+16];

// 問題1
System.out.println(sb2.length()); // 3 => 實際裝入陣列的長度

// 問題2 擴容問題:若要新增的資料底層的陣列盛不下了,那就需要擴容底層的陣列,默認情況下,擴容為原來容量的2倍再加2,同時將原有陣列中的元素複製到新的陣列中

// 開發中建議使用:StringBuffer(int capacity) 或 StringBuilder(int capacity),避免一開始就擴容

StringBuffer, StringBuilder 常見方法 總結

增 append(xxx);
刪 delete(int start, int end)
改 setChar(int index, char ch)/ replace(int start, int end, String str)
查 charAt(int index)
插入 insert(int offset, xxx)
長度 length()
遍歷 for loop + charAt()