在做字串處理的時候都使用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的。
沒有留言:
張貼留言