应显式使用StringBuilder的场景包括:循环次数≥5且每次拼接内容长度>10字符、跨方法调用无法编译优化、可预估总长度并设初始容量、需多次插入删除等;初始化宜显式指定容量避免频繁扩容;链式append更高效,禁用循环内String+=和混用+与append;单线程优先StringBuilder,多线程共享才选StringBuffer。

用 StringBuilder 替代 String += 能显著减少对象创建和内存开销,尤其在循环拼接或大量文本处理时效果明显。但不是所有拼接场景都必须上 StringBuilder——关键看是否落在性能敏感路径上。
什么时候该用 StringBuilder?
以下情况建议显式使用 StringBuilder:
- 循环内拼接(如日志组装、SQL 构建、HTML 生成),且循环次数 ≥ 5,每次拼接内容长度 > 10 字符
- 拼接逻辑跨多个方法调用(如递归、回调),编译器无法做跨语句优化
- 已知最终字符串长度(例如导出万条记录的 CSV),可预估并设置初始容量
- 需要多次插入、删除或替换(如动态去尾逗号、格式化模板),纯追加更高效
如何初始化更高效?
StringBuilder 默认容量为 16,但频繁扩容会触发数组复制,带来额外开销:
- 若能粗略估算总长度(如 100 个平均 20 字符的字符串 + 99 个逗号),建议显式设置:new StringBuilder(2100)
- 不确定长度但数据量大时,宁可稍高估容量,避免多次翻倍扩容(扩容公式:新容量 = 旧容量 × 2 + 1)
- 对 ThreadLocal 复用场景(如日志缓冲区),推荐预设固定容量(如 1024),复用前调用 setLength(0) 清空内容
怎么写才真正高效?
高效不只靠换类,更在于写法细节:
立即学习“Java免费学习笔记(深入)”;
- 坚持链式调用 append():sb.append("ID:").append(id).append(", name:").append(name),它支持多种类型参数,自动 toString(),无额外开销
- 避免混用 + 和 append():如 sb.append("a" + "b"),会让编译器先生成临时 StringBuilder,得不偿失
- 别在循环里写 String s = ""; s += item;——每次迭代都新建 String 对象,时间复杂度接近 O(n²)
- 拼接完成务必调用 toString() 获取最终字符串;非必要不频繁调用 insert/delete/replace/reverse,它们涉及字符移动,开销高于 append
StringBuilder 和 StringBuffer 怎么选?
两者底层机制相似,核心区别在并发支持:
- StringBuilder 非线程安全,无同步开销,单线程下性能最高——绝大多数场景(方法内局部变量、ThreadLocal)应选它
- StringBuffer 所有方法加了 synchronized,适合多线程共享同一实例的极少数场景(如老系统全局配置拼接器)
- 误用 static StringBuilder 全局共享会导致乱序、丢字符甚至 ArrayIndexOutOfBoundsException,务必避免



















