使用 StringBuilder 替代 String += 可显著减少对象创建和内存开销;预设合理初始容量、坚持链式 append()、避免循环中用 +=、及时 toString(),并慎用 insert/delete/replace 等高开销操作。

直接用 StringBuilder 替代 String +=,能显著减少对象创建和内存开销,尤其在循环拼接或大量文本处理时效果明显。
预设合理初始容量
StringBuilder 内部基于 char 数组实现,容量不足时会自动扩容(通常是翻倍),而扩容需复制原数组,带来额外开销。若能预估最终字符串长度,应显式指定初始容量。
- 默认构造器容量为 16,适合极简场景;拼接内容较多时建议主动设置,如 new StringBuilder(512)
- 对集合拼接,可按元素数量 × 平均长度 + 分隔符长度粗略估算,例如 100 个平均 20 字符的字符串加逗号分隔,预设 2100 左右较稳妥
- 不确定长度但数据量大时,宁可稍高估,避免频繁扩容
坚持链式调用 append()
append() 方法返回 this,支持连续调用,既简洁又高效。它能接受 boolean、int、double、Object 等各类参数,自动调用 toString() 转换,无需手动拼接或类型判断。
- 推荐写法:sb.append("ID:").append(id).append(", name:").append(name)
- 避免拆成多行单独调用,除非逻辑复杂需注释;链式本身不影响可读性,且无性能损失
- 不要混用 + 和 append,例如 sb.append("a" + "b")——这会让编译器先生成临时 StringBuilder,得不偿失
别在循环里用 String +=
看似简洁的 String s = ""; for (...) { s += item; } 在每次迭代中都会新建 String 对象,时间复杂度接近 O(n²),1000 次拼接可能产生上千个中间对象。
立即学习“Java免费学习笔记(深入)”;
- 必须改为外置 StringBuilder:循环前创建,循环内只 append,循环后统一 toString()
- 即使只有几十次拼接,也建议统一风格,避免后期数据量增长后性能骤降
- 注意:编译器虽会对静态字面量拼接(如 "a" + "b")优化,但对变量参与的运行期拼接不做跨语句优化
用完及时 toString(),不滥用其他操作
StringBuilder 是工具对象,不是最终结果。拼接完成后务必调用 toString() 获取 String 实例;同时,insert、delete、replace 等操作虽强大,但非必要时不建议频繁使用,它们涉及字符移动,开销高于纯追加。
- 如需去尾逗号,优先用 sb.delete(sb.length()-1, sb.length()),比截取 substring 更高效
- 避免在高频路径中调用 reverse() 或复杂 replace(),除非业务强依赖
- 若只需简单分隔拼接,考虑 String.join() 或 StringJoiner,代码更语义化且性能接近



















