java.lang.StringBuffer 代表可變的字元序列,可以對字串內容進行增刪
很多方法和 String 相同,但 StringBuffer 是可變長度的
StringBuffer 是一個容器
注意:
StringBuffer的構造器
// Constructor and Description
StringBuffer()
// 構造一個其中不帶字元的字串緩衝區,其初始容量為16個字元
StringBuffer(CharSequence seq)
// 構造一個字串緩衝區,包含與指定的CharSequener相同的字元
StringBuffer(int capacity)
// 構造一個其中不帶字元,但具有指定初始容量的的字串緩衝區,即對char[]大小進行指定
StringBuffer(String str)
//// 構造一個字串緩衝區,並將其內容初始化為指定的字串內容
String s = "hello";
方式一:
StringBuffer b1 = new StringBuffer(s);
方式二:
StringBuffer b2 = new StringBuffer();
b2.append(s);
方式一:
String s2 = b1.toString()
方式二:
String s3 = new String(b1);
StringBuffer append() // 增
StringBuffer delete(int start, int end) // 刪
StringBuffer insert() // 插入
StringBuffer replace(int start, int end, String str) // 改
int indexOf(String str) // 查
int length() // 獲取長度
練習題
String str = null;
StringBuffer sb = new StringBuffer();
sb.append(str); // 呼叫的AbstractStringBuilder的 appendNull方法
System.out.println(sb.length()); // 4 null --> value = {'n', 'u', 'l', 'l'}
System.out.println(sb.capacity()); // 16
System.out.println(sb);
StringBuffer sb1 = new StringBuffer(str); //NullPointerException super(str.length() + 16);
System.out.println(sb1);
注意:
StringBuilder 和 StringBuffer 非常類似,均代表可變的字元序列,且方法也一樣
String 不可變字元序列,效率低,但是複用率高
StringBuffer:可變字元序列,效率較高(增刪)、執行緒安全
StringBuilder:可變字元序列,效率最高,執行緒不安全
String 使用注意說明:
String s = "a"; // 建立一個字串
s += "b";
/*
實際上原來的 "a" 字串物件已經丟棄了,現在又產生了一個字串是 s + "b" (即"ab")。如果多次執行這些改變串內容的操作,會導致的大量副本字串物件存在記憶體中,降低效率。如果這樣的操作放到迴圈中,會極大的影響程式的效能
==> 結論:如果我們對String做大量修改,不要使用String
*/
long startTime = 0L;
long endTime = 0L;
// StringBuffer
StringBuffer stringBuffer = new StringBuffer("");
startTime = System.currentTimeMillis();
for (int i = 0; i < 20000; i++) {
stringBuffer.append(String.valueOf(i));
}
endTime = System.currentTimeMillis();
System.out.println("StringBuffer的執行時間:" + (endTime - startTime));
// StringBuilder
StringBuilder stringBuilder = new StringBuilder("");
startTime = System.currentTimeMillis();
for (int i = 0; i < 20000; i++) {
stringBuilder.append(String.valueOf(i));
}
endTime = System.currentTimeMillis();
System.out.println("StringBuilder的執行時間:" + (endTime - startTime));
//String
String text = "";
startTime = System.currentTimeMillis();
for (int i = 0; i < 20000; i++) {
text += i;
}
endTime = System.currentTimeMillis();
System.out.println("String的執行時間:" + (endTime - startTime));
// StringBuffer的執行時間:5
//StringBuilder的執行時間:2
//String的執行時間:1463
// 測試結果:StringBuilder > StringBuffer > String
使用的原則、結論:
如果字串存在大量的修改操作,一般使用StringBuffer 和 StringBuilder
如果字串存在大量的修改操作,並在單執行緒的情況,使用StringBuilder
如果字串存在大量的修改操作,並在多執行緒的情況,使用StringBuffer
如果字串很少修改,被多個物件參照,使用 String,比如設定資訊等