1. 程式人生 > >StringBuffer 與 StringBuilder 區別與聯絡及原始碼分析

StringBuffer 與 StringBuilder 區別與聯絡及原始碼分析

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()操作重新賦值的。