1、效率: StringBuilder > StringBuffer > String
分析:
①Java中對String對象進行的操作實際上是一個不斷創建新的對象並且將舊的對象回收的一個過程,所以執行速度很慢。
②String在java中是不可變長的,一旦初始化就不能修改長度,簡單的字符串拼接其實是創建新的String對象,再把拼接後的內容賦值給新的對象,在頻繁修改的情況下會頻繁創建對象。而StringBuffer和StringBuilder則不會,他們始終是同一個對象,只是可以不停的在最後面append而已。
2、安全性:
StringBuffer是線程安全,可以不需要額外的同步用於多線程中;
StringBuilder是非同步,運行於多線程中就需要使用着單獨同步處理,但是速度就比StringBuffer快多了;
分析:
如果一個StringBuffer對象在字符串緩衝區被多個線程使用時,StringBuffer中很多方法可以帶有synchronized關鍵字,所以可以保證線程是安全的,但StringBuilder的方法則沒有該關鍵字,所以不能保證線程安全,有可能會出現一些錯誤的操作。
所以如果要進行的操作是多線程的,那麼就要使用StringBuffer,但是在單線程的情況下,還是建議使用速度比較快的StringBuilder。
寫了個測試代碼,測試效率,代碼如下:
@Test
public void test2() {
String text = "";
long startTime = 0L;
long endTime = 0L;
StringBuffer buffer = new StringBuffer("");
StringBuilder builder = new StringBuilder("");
startTime = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
buffer.append(i);
}
endTime = System.currentTimeMillis();
System.out.println("StringBuffer的執行時間:" + (endTime - startTime));
startTime = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
builder.append(i);
}
endTime = System.currentTimeMillis();
System.out.println("StringBuilder的執行時間:" + (endTime - startTime));
startTime = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
text = text + i;
}
endTime = System.currentTimeMillis();
System.out.println("String的執行時間:" + (endTime - startTime));
}
測試結果如下截圖:
總結:在拼接方面,StringBuilder要比StringBuffer效率要高。如果是單線程不需要考慮同步問題,則可以使用StringBuilder提高效率。