高效字符串拼接需用StringBuilder并预估容量,如new StringBuilder(1000*50);循环外创建、复用实例;优先调用append(int)等重载方法;分隔场景推荐StringJoiner。

直接在循环里用+拼接字符串会导致大量临时String对象产生,性能急剧下降。用StringBuilder并合理初始化容量,是高效处理大批量字符串拼接的关键。
提前预估容量,避免扩容开销
StringBuilder底层是字符数组,每次append()超出当前容量时会触发数组复制(默认扩容为oldCapacity * 2 + 2),频繁扩容非常耗时。若已知最终字符串大致长度,应显式指定初始容量:
- 例如拼接1000个平均长度为50的字符串,可初始化为
new StringBuilder(1000 * 50) - 若长度差异大,可略留余量,如
new StringBuilder((int)(1000 * 50 * 1.2)) - 完全无法预估时,至少设一个合理起点(如
new StringBuilder(4096)),比默认16更稳妥
复用同一实例,不在循环内反复创建
不要在循环体中每次都new StringBuilder(),这会抵消优化效果:
- ✅ 正确:在循环外创建一次,循环内只调用
append() - ❌ 错误:
for (...) { StringBuilder sb = new StringBuilder(); sb.append(...); } - 若需多次独立拼接,考虑重置而非重建——调用
sb.setLength(0)清空内容,保留底层数组
避免隐式装箱和多余操作
拼接过程中注意数据类型和调用方式,减少额外开销:
- 拼接数字时,优先用
append(int)、append(long)等重载方法,而非append(String.valueOf(n)) - 避免在
append()中做复杂表达式或方法调用;如需格式化,提前计算好字符串再拼接 - 结尾不需要
toString().intern()除非真有字符串驻留需求,否则徒增GC压力
批量拼接带分隔符的场景:用StringJoiner或手动控制
若拼接结果需以逗号、换行等分隔,不推荐在循环中用if (i > 0) sb.append(",")判断:
- 更简洁安全的方式是使用
StringJoiner(Java 8+),它自动处理分隔逻辑且支持前缀/后缀 - 若仍用
StringBuilder,可先拼所有项,最后用substring()去掉首/尾多余分隔符,或用deleteCharAt()微调 - 对超大数据集(如百万级),还可考虑分批拼接+合并,缓解单次内存峰值
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











