字符串拼接是高頻操作,StringBuilder 為非線程安全、高性能首選。本文通過 KMP/BF/內建 indexOf 算法對比場景,副產出 StringBuilder 大規模構建性能數據。
public static String buildString(int len, String charSet) {
StringBuilder sb = new StringBuilder(len); // 預分配容量,關鍵優化
Random random = new Random();
for (int i = 0; i < len; i++) {
char c = ...; // 從字符集隨機選字符
sb.append(c);
}
return sb.toString();
}
| 指標 | 耗時 | 佔比 |
|---|---|---|
字符串構建 (allbuild) | 26,501 ms | 90.7% |
轉字符數組 (toCharArray) | 637 ms | 2.2% |
| BF 算法 | 550 ms | 1.9% |
| String.indexOf | 335 ms | 1.1% |
| KMP 算法 | 450 ms | 1.5% |
| GC 總計 | 734 ms | 2.5% |
| 總計 | 29,211 ms | 100% |
append,約 1,600 萬次/秒。預分配容量 new StringBuilder(len) 避免擴容拷貝,是最大優化點。toCharArray() 開銷不可忽視:KMP 需字符數組,轉換成本約構建的 2.4%。indexOf 最快:雙向掃描 + 優化算法(非純 KMP),C 實現(Intrinsics)極致優化。StringBuilder 內部 char[] 擴容產生臨時數組,但 Young GC 處理極快。new StringBuilder(estimatedLength)。StringBuilder;多線程用 StringBuffer(同步開銷大)。+ 拼接:每次隱式創建 StringBuilder + toString,性能災難。char[] 直接操作或 java.nio.CharBuffer 避免中間對象。System.currentTimeMillis(),消除 JIT 預熱、死碼消除、偽共享等干擾。測試代碼亦暴露基準測試常見坑:樣本生成耗時佔主導、GC 干擾、單次測試統計誤差大。生產級性能分析請使用 JMH + Profiling (async-profiler/JFR),讓數據說話。