StringBuilder优化核心在于合理初始化、循环外创建、复用及选用合适append方法;预估容量避免扩容,复用setLength(0),优先调用基本类型重载,分隔场景用StringJoiner更优。

用 StringBuilder 优化大规模字符串构建,核心不是“用了没”,而是“怎么初始化、怎么调用、怎么复用”。它快,是因为绕开了 String 不可变带来的重复创建和复制;但用得不对,效果会大打折扣。
预估容量,避免频繁扩容
StringBuilder 底层是 char[] 数组,初始容量默认只有 16。每次 append 超出当前容量,就会触发扩容:新容量 = 旧容量 × 2 + 2,并复制全部已有内容。百万级拼接中反复扩容,性能损耗明显。
- 如果拼接 5000 个平均长度为 40 的字符串,建议初始化为 new StringBuilder(200000)
- 长度波动大时,可加 20% 余量:new StringBuilder((int)(5000 * 40 * 1.2))
- 完全无法预估,也别用默认值,至少设 new StringBuilder(4096) 起步
循环外创建,循环内只 append
不要在 for 或 while 循环体内 new StringBuilder()——这等于把优化全白做了。每次 new 都分配新数组,还丢弃前一个实例,GC 压力不减反增。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- ✅ 正确:在循环前创建一次,循环中只调 append()
- ❌ 错误:for (...) { StringBuilder sb = new StringBuilder(); sb.append(...); }
- 需多次独立拼接时,可用 sb.setLength(0) 清空内容复用,比反复 new 更轻量
选对 append 方法,减少隐式开销
append() 有大量重载方法,直接传基本类型或字符,比先转成字符串再拼更高效。
立即学习“Java免费学习笔记(深入)”;
- 拼数字优先用 append(int)、append(long),而非 append(String.valueOf(n))
- 避免在 append() 参数里写复杂表达式,如 append(getName() + "@" + getDomain()) —— 这段内部又触发了 String 拼接
- 需要格式化(如日期、金额),提前算好字符串再 append,别在循环里实时格式化
分隔场景优先用 StringJoiner 或手动控制边界
拼带逗号、换行等分隔符的列表时,别靠 if 判断首尾来拼接,逻辑易错且冗余。
- Java 8+ 推荐 StringJoiner(", ", "[", "]"),自动处理分隔、前后缀
- 若坚持用 StringBuilder,可先全部 append,最后用 deleteCharAt(0) 或 substring(1) 去掉开头多余分隔符
- 超大数据(如百万项),考虑分批拼接再合并,缓解单次内存峰值

















