2013年6月27日 星期四

String vs StringBuilder vs StringBuffer

以前沒有考慮執行效率時

在做字串處理的時候都使用String,

如果你的字串處理需要常常變換長度和內容的話,

String s="";
for(int i=1;i<=a;i++){
 s+="2";
}



在每一次的 + 執行時,

都會產生一個新的String對象,

然後把指針指向它,

當然舊的對象GC機制會接收,

但這樣也就影響效能了,

下面的程式嘗試改用StringBuilder和StringBuffer,

public class TestStringBuilder {

 public static void main(String[] args) {
  int a = 100000;
  String str = "2";

  long start = System.currentTimeMillis();
  String s = "";
  for (int i = 1; i <= a; i++) {
   s += str;
  }
  long end = System.currentTimeMillis();
  System.out.println("String 共使用了" + (end - start) + "毫秒");

  start = System.currentTimeMillis();
  StringBuilder sb = new StringBuilder("");
  for (int i = 1; i <= a; i++) {
   sb.append(str);
  }
  end = System.currentTimeMillis();
  System.out.println("StringBuilder 共使用了" + (end - start) + "毫秒");

  start = System.currentTimeMillis();
  StringBuffer sb1 = new StringBuffer("");
  for (int i = 1; i <= a; i++) {
   sb1.append(str);
  }
  end = System.currentTimeMillis();
  System.out.println("StringBuffer 共使用了" + (end - start) + "毫秒");
 }

}

執行結果如下:

String 共使用了4601毫秒
StringBuilder 共使用了4毫秒
StringBuffer 共使用了10毫秒

可以發現String效率相當緩慢,

而由於StringBuilder是單線程的,

執行效率又比StringBuffer快速一些,

但如果需要使用在多個線程上的話,

還是必須使用會同步且執行緒安全的StringBuffer,

最後這邊有一段附註,

如果你的字符串不是外來的拼接,

像是String s="12"+"34"+"5678"+"910"+"abc"+"defg";

這時候StringBuilder就沒有優勢了,

因為對JVM來說,

相當於是String s="12345678910abcdefg";

因此速度上同一行在分號之前的拼接處理上,

String是優於StringBuilder的。

沒有留言:

張貼留言