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