說明:
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);</pre>