stringbuilder通过预分配容量、复用实例和避免隐式操作优化性能:应指定足够初始容量(如256)、循环中用setlength(0)复用、禁用空拼接及频繁tostring()。

StringBuilder 通过预分配内部字符数组并支持原地修改,避免了 String 不可变性带来的频繁内存分配问题。关键在于合理设置初始容量、复用实例、避免隐式扩容。
预先设定足够大的初始容量
默认构造函数创建的 StringBuilder 内部数组长度为 16,一旦追加内容超出,就会触发扩容(通常是当前容量的 1.5 倍 + 1),产生新数组并复制旧数据。若已知最终字符串大致长度,应直接指定初始容量:
-
推荐写法:
StringBuilder sb = new StringBuilder(256);(预估最大长度) -
避免写法:
StringBuilder sb = new StringBuilder();后反复append()数百次
复用同一 StringBuilder 实例
在循环或高频调用场景中,不要每次新建 StringBuilder,而应在作用域内复用并及时清空:
- 使用
setLength(0)快速清空(不释放内存,仅重置长度) - 避免
new StringBuilder()或sb = new StringBuilder()重建对象 - 例如日志拼接、SQL 构建等重复任务中,将 StringBuilder 作为局部变量复用
避免隐式 toString() 和中间 String 创建
某些操作会意外触发字符串生成,导致临时对象:
- 不用
sb.append("").append("..."),空字符串拼接无意义且增加冗余 - 避免在循环中频繁调用
sb.toString()获取中间结果;如需阶段性结果,考虑分段构建或延迟转换 - 注意
sb.insert(0, "x")等操作可能引发数组整体移动,性能低于尾部追加
监控扩容行为(调试阶段)
可通过反射或 JVM 工具观察内部数组变化,但更实用的是:在关键路径中估算最大长度,并预留 10%~20% 余量。例如拼接 100 个平均长度 20 的字符串,预设容量建议 ≥ 220。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











