說明:
String 為常量,每次必創造新常量賦值,耗內存及效能
StringBuilder及StringBuffer為變量, 後者可synchronized線程安全
實驗:
分別跑三萬筆累加字串,測試效能。
結果:
2020-01-06 15:58:32.670 4166-4166/adamtest, String: 24794(ms)
2020-01-06 15:58:32.685 4166-4166/adamtest, StringBuilder:5(ms)
2020-01-06 15:58:32.705 4166-4166/adamtest, StringBuffer:18(ms)
結論:
單線程盡量用StringBuilder, 多線程保障安全時才用StringBuffer
int count = 30000;
long startNs = System.nanoTime();
String str = "";
for(int i=0;i<count;i++){
str = str + i;
}
long tookMs = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNs);
LogUtils.e("adam", "adamtest, String: "+ tookMs+"(ms) "+str);
long startNs2 = System.nanoTime();
StringBuilder stringBuilder = new StringBuilder();
for(int i=0;i<count;i++){
stringBuilder.append(i);
}
long tookMs2 = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNs2);
LogUtils.e("adam", "adamtest, StringBuilder:"+ tookMs2+"(ms) "+stringBuilder);
long startNs3= System.nanoTime();
StringBuffer stringBuffer = new StringBuffer();
for(int i=0;i<count;i++){
stringBuffer.append(i);
}
long tookMs3 = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNs3);
LogUtils.e("adam", "adamtest, StringBuffer:"+ tookMs3+"(ms) "+stringBuffer);