必须在循环外初始化 stringbuilder 并复用,禁止每次循环都 new;正确做法是循环前创建一次,错误是循环内重复创建。

循环中拼接字符串,必须用 StringBuilder,且不能只“用了就行”,关键在初始化、调用方式和收尾动作。
循环外初始化 StringBuilder,别放 inside
每次循环都 new 一个 StringBuilder,等于把性能问题从 String 搬到了对象创建上。它不是“多建几个没关系”的轻量对象。
- ✅ 正确:在 for 或 while 循环之前创建一次,复用同一个实例
- ❌ 错误:for (int i = 0; i
- 特别注意:不要在方法内部、循环体里反复 new,哪怕只 append 一两次——只要循环次数 ≥5,就值得提出来复用
预估容量,避免频繁扩容
StringBuilder 底层是数组,扩容要复制整个旧数组。默认 16 容量,在拼接日志、JSON、SQL 等场景下,几轮就触发翻倍扩容(16→32→64→128…),白白消耗 CPU。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 估算公式:元素个数 × 平均单条长度 × 1.2(留余量)
- 例如拼接 300 条用户信息,每条约 40 字符 → new StringBuilder(300 * 40 * 1.2) ≈ 14400
- 不确定长度但有上限?设个稳妥值,比如 new StringBuilder(1024),比默认 16 更实用
循环内只 append,最后才 toString()
String 不可变,StringBuilder 可变——这个区别决定了操作节奏。中间调 toString() 不仅白费算力,还会让后续 append 失去意义,甚至引发逻辑错误。
- ✅ 全程链式 append:sb.append("ID: ").append(id).append(", name: ").append(name)
- ❌ 切忌循环里 sb.toString():不仅生成无用 String,还可能因引用残留导致后续拼接错乱
- ⚠️ 拼完必须调 toString():不执行这步,你拿到的是 StringBuilder 实例,传给需要 String 的 API(如 log.info、http response)会直接报 ClassCastException
别把它当 String 用,也别让它跨线程共享
StringBuilder 是工具,不是数据载体。它没重写 equals/hashCode,也不保证线程安全,设计目标就是“快拼、快丢”。
- 不能放进 Map/Set 当 key,也不能长期缓存为类字段(除非明确控制生命周期)
- 多线程场景下,别给 StringBuilder 加 synchronized——改用 StringBuffer,或更推荐:每个线程用自己独立的实例
- 需要多次复用?用 sb.setLength(0) 清空比 new 更轻量,但确保没有其他变量还持有它的引用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










