上文介紹了SringBuffer,StringBuilder和String在拼接字符串時候的效率對比。可以看出效率 StringBuilder > StringBuffer > String。但是我們在使用的過程中,最後都會把SringBuffer和StringBuilder轉成String進行使用。它們兩個都有toString方法可以調用,那麼它們轉成String的效率也是 StringBuilder > StringBuffer 嗎?
答案:不一定!!!
測試代碼走起:
@Test
public void test2() {
long startTime = 0L;
long endTime = 0L;
StringBuffer buffer = new StringBuffer("");
StringBuilder builder = new StringBuilder("");
startTime = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
buffer.append(i);
}
endTime = System.currentTimeMillis();
System.out.println("StringBuffer的執行時間:" + (endTime - startTime));
startTime = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
builder.append(i);
}
endTime = System.currentTimeMillis();
System.out.println("StringBuilder的執行時間:" + (endTime - startTime));
startTime = System.currentTimeMillis();
buffer.toString();
endTime = System.currentTimeMillis();
System.out.println("StringBuffer轉成String,耗時:" + (endTime - startTime));
startTime = System.currentTimeMillis();
builder.toString();
endTime = System.currentTimeMillis();
System.out.println("StringBuilder轉成String,耗時:" + (endTime - startTime));
}
這是我運行多次,截取了2次的結果截圖:
可以看出,多次運行也會出現StringBuffer的toString時間要小於StringBuilder的toString時間的情況。
總結:
在拼接字符串方面,StringBuilder要比StringBuffer效率要高,但是在轉成String的時候,兩者效率不相上下。
如何使用:
根據具體項目來判斷使用哪個,沒有必要糾結一定要使用哪個。
如果是單線程不需要考慮同步問題,則可以使用StringBuilder提高效率。
如果是多線程需要考慮數據同步問題,就要使用StringBuffer確保線程安全。