StringBuffer 與 StringBuilder 區別與聯絡及原始碼分析
阿新 • • 發佈:2018-12-30
StringBuffer和StringBuilder的共同點:
1、都是用於操作字串,使用這兩個而不使用String的原因是因為String是Final型別,當對字串操作較多時採用StringBuffer或者StringBuilder。
String Final原始碼,在建立String物件傳遞的值,value定義的是final 的char[];
private final char[] value;
public String(String paramString)
{
this.value = paramString.value;
this .hash = paramString.hash;
}
StringBuffer和StringBuilder的不同點:
1、StringBuffer是單執行緒的,因為裡面的方法都是被synchronized修飾了。所以它執行緒安全,但是效率自然就降低。
我們看一下StringBuffer裡面的append方法的原始碼:
public synchronized StringBuffer append(Object paramObject)
{
super.append(String.valueOf(paramObject));
return this ;
}
2、StringBuilder不是是單執行緒的,因為裡面的方法沒有被synchronized修飾了。所以它執行緒不安全,所以效率要更高。
我們看一下StringBuilder裡面的append方法的原始碼:
public StringBuilder append(char paramChar)
{
super.append(paramChar);
return this;
}
3、StringBuffer和StringBuilder效能測試程式
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
long builderThreadStartTime = (new Date()).getTime();//builder 多執行緒開始時間
for(int i=0;i<10000000;i++){
sb.append(i);
}
long builderThreadEndTime = (new Date()).getTime();//builder 多執行緒結束時間
System.out.println("builder 多執行緒消耗時間==="+(builderThreadEndTime-builderThreadStartTime));
StringBuffer sbf = new StringBuffer();
long bufferThreadStartTime = (new Date()).getTime();//buffer 單執行緒開始時間
for(int i=0;i<10000000;i++){
sbf.append(i);
}
long bufferThreadEndTime = (new Date()).getTime();//buffer 單執行緒結束時間
System.out.println("buffer 單執行緒消耗時間==="+(bufferThreadEndTime-bufferThreadStartTime));
}
輸出結果:
builder 多執行緒消耗時間===391
buffer 單執行緒消耗時間===611
4、為什麼String是Final型別,確可以進行+等操作呢?
答:因為String的+操作實際是通過StringBuffer的append方法進行操作,然後又通過StringBuffer的toString()操作重新賦值的。