使用 StringBuilder 拼接大量字符串应预估容量、复用实例、避免频繁 toString();优先调用 append() 重载方法;多线程场景需改用 StringBuffer 或隔离实例。

用 StringBuilder 拼接大量字符串,核心是避免频繁创建新对象,提前预估容量、复用实例、减少自动扩容。
初始化时指定足够容量
每次扩容会触发数组复制(时间复杂度 O(n)),尤其拼接成千上万个字符串时影响明显。如果能预估最终长度,直接传入初始容量:
- 例如拼接 1000 个平均长度 50 的字符串,可设
new StringBuilder(1000 * 50)(即 50000) - 若不确定,宁可略大勿小,比如按预估值 ×1.2~1.5
- 完全未知时,至少用默认构造(容量 16)的替代方案:传入一个合理下限,如
new StringBuilder(1024)
优先用 append(),别反复 toString()
toString() 返回的是新 String 对象,且会触发内部字符数组快照;若在循环中频繁调用,等于白做优化:
- 错误写法:
for (String s : list) { sb.append(s).toString(); }—— 每次都生成无用字符串 - 正确做法:所有拼接完成后再调用一次
sb.toString() - 中间需要检查内容?用
sb.length()或sb.indexOf(...)等不触发拷贝的方法
批量拼接时善用重载方法
StringBuilder 提供多个高效重载,比逐字符/逐字符串拼接更优:
立即学习“Java免费学习笔记(深入)”;
- 拼接数组:用
append(char[])或append(CharSequence),比遍历每个元素append(String)少一次方法调用开销 - 拼接数字:直接
append(123),比append(String.valueOf(123))少一次装箱和字符串转换 - 插入分隔符:用
String.join(", ", list)更简洁;若必须用 StringBuilder,可在第一次后加if (i > 0) sb.append(", ");
多线程场景记得换 StringBuffer 或加锁
StringBuilder 是非线程安全的,多线程共用同一实例会引发数据错乱:
- 单线程:放心用
StringBuilder,性能最好 - 多线程且需共享拼接结果:改用
StringBuffer(方法加了 synchronized) - 或保持
StringBuilder,但每个线程创建独立实例,最后用String.join合并结果


















