使用 StringBuilder 拼接字符串应提前预估容量、循环外创建并复用实例、避免循环内频繁 toString();单线程优先选 StringBuilder,多线程可选 StringBuffer 或局部变量策略。

直接在循环里用 + 拼接字符串会导致大量临时对象创建,性能差;用 StringBuilder 是标准解法,关键在于提前预估容量、复用实例、避免隐式 toString() 调用过多。
初始化时指定足够容量
默认构造的 StringBuilder 初始容量是 16,如果拼接内容远超这个值,内部数组会反复扩容(每次约翻倍),触发多次数组复制。应根据大致长度提前设置容量:
- 估算总字符数(比如每轮拼接约 50 字符,循环 10000 次 → 预估 500000),传入构造函数:
new StringBuilder(500000) - 若无法精确估算,可略留余量,比如乘以 1.2;宁大勿小,避免频繁扩容
在循环外创建,循环内复用
不要在每次循环中 new StringBuilder(),否则失去性能优势:
- ✅ 正确:循环前创建一次,循环中反复
append() - ❌ 错误:循环体内 new StringBuilder(),再 append 再 toString() —— 等价于字符串加法
避免在循环中频繁调用 toString()
toString() 每次都生成新 String 对象。如只需最终结果,就只在循环结束后调用一次:
- 不要写
sb.append("...").toString()在循环里 - 也不要在循环中用
sb.toString().length()判断长度 —— 直接用sb.length() - 需要中间结果?考虑是否真有必要,或改用其他逻辑(如记录索引、分段处理)
注意线程安全与场景选择
StringBuilder 是非线程安全的,单线程场景下比 StringBuffer 更快:
- 多线程环境且需共享拼接器?改用 StringBuffer,或改用局部变量 + 合并策略
- 如果只是生成日志、SQL 或 JSON 片段等一次性文本,StringBuilder 完全够用
- Java 8+ 中对简单拼接(如
String.join()、Collectors.joining())也适用,但复杂逻辑仍推荐 StringBuilder
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











