应优先用 StringBuilder 拼接,避免 String+或concat导致频繁创建新对象;循环内拼接、超3次非常量拼接、需插入删除等场景必须用;须复用实例、预设容量、仅末尾调用toString();字面量拼接、少量静态拼接可不优化;禁用s+="x"、new String()、多线程共用、长期持有清空重用。

用 StringBuilder 拼接,而不是用 + 或 String.concat()。核心不是“怎么拼”,而是“别让每次拼都生成新 String 对象”——因为 String 一旦创建,内容就锁死,所有“修改”本质都是复制 + 新建。
什么时候必须换 StringBuilder?
以下情况直接用 StringBuilder,别犹豫:
- 在 循环内部做字符串拼接(哪怕只有几十次),例如组装日志、生成 SQL、遍历集合构参
- 拼接操作超过 3 次且非编译期常量(如
"a" + "b" + "c"编译器会优化,但s1 + s2 + s3不会) - 需要频繁 插入、删除、替换子串(
StringBuilder提供insert()、delete()、replace()等原地操作)
怎么写才真正避免对象爆炸?
光换类不够,关键在写法细节:
- 在循环外创建 StringBuilder 实例,复用同一个对象,不要每轮 new 一个
-
初始化时预估容量,比如最终字符串大概 5000 字符,就写
new StringBuilder(5000);避免默认 16 容量导致多次扩容复制数组 -
只在最后调用一次
toString(),不在循环里反复调用——否则每轮都造新 String,白忙一场 - 注意
append(null)会写入字符串"null",如需跳过空值,提前判空或用Objects.toString(s, "")
哪些情况其实不用动 StringBuilder?
不是所有拼接都值得手动优化,JVM 已悄悄帮你扛了:
- 纯字面量拼接:
"hello" + "world" + "!"→ 编译期直接合成一个字符串字面量 - 少量、静态、非循环拼接(如方法内拼 2~3 次),JIT 后期可能自动转成 StringBuilder
- 用
String.join()、String.formatted()或MessageFormat,这些 API 内部已做优化
别踩的典型误区
很多性能问题不是因为没用 StringBuilder,而是用错了方式:
- 误以为
s += "x"是在改原对象——其实等价于s = new StringBuilder().append(s).append("x").toString(),每轮都在造新对象 - 写
new String("abc")强制堆上新建,绕过常量池,多占一份内存 - 多线程共用一个 StringBuilder 而不加锁——它不安全,数据可能错乱;真要并发,请用 StringBuffer
- 把 StringBuilder 当“万能字符串容器”长期持有并反复清空重用,不如按需创建更清晰
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











