用 StringBuilder 替代 String 循环拼接可显著提升性能,因 String 不可变致每次拼接生成新对象、时间复杂度 O(n²),而 StringBuilder 可变且基于数组、扩容合理,拼接为 O(n);正确做法是循环外初始化 StringBuilder 并复用 append,避免循环内新建或频繁 toString。

在 Java 中,用 StringBuilder 替代 String 在循环中拼接字符串,核心在于避免创建大量临时 String 对象。因为 String 不可变,每次 + 拼接都会生成新对象,时间复杂度接近 O(n²);而 StringBuilder 可变、内部基于字符数组,扩容策略合理,拼接是 O(n) 级别。
为什么循环里用 String += 会慢?
每轮循环执行 str += "xxx",实际等价于:
- 创建一个新的
StringBuilder(隐式) - 将原
String和新增内容 append 进去 - 调用
toString()生成新String - 原
String对象失去引用,等待 GC
循环 n 次,就新建约 n 个 StringBuilder 和 n 个 String,内存和 CPU 开销明显上升。
正确使用 StringBuilder 的写法
提前声明一个 StringBuilder 实例,在循环外初始化,循环内只调用 append():
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
StringBuilder sb = new StringBuilder(); // 推荐指定初始容量,如 new StringBuilder(128)
for (String item : list) {
sb.append(item).append(","); // 链式调用,高效且简洁
}
String result = sb.toString(); // 仅最后调用一次 toString()
小技巧:
- 若已知最终字符串大致长度,构造时传入容量(如
new StringBuilder(512)),可减少数组扩容次数 - 避免在循环内反复调用
toString(),它会创建新String,破坏优化效果 -
append()支持多种类型(int、boolean、Object等),无需手动String.valueOf()
常见误用场景提醒
以下写法看似用了 StringBuilder,但没真正发挥优势:
- 在循环内 new StringBuilder():每次新建对象,等于回到 String 拼接的老路
- 循环中 sb.toString() + "xxx":又触发了不可变字符串拼接,产生临时对象
-
用 sb.append(x).toString() 每次取结果:频繁创建
String,GC 压力大
记住:StringBuilder 是工具,不是装饰——它要复用,不是点缀。
性能对比参考(简单示意)
拼接 10,000 个短字符串(平均长度 10):
-
String +=:通常耗时 5–20ms(JDK8+ 有编译器优化,但仍有明显开销) -
StringBuilder(预设容量):通常低于 0.5ms - 差距随数据量增大而急剧拉大,万级以上差异可达百倍
实际项目中,尤其日志拼接、JSON 组装、SQL 构建等高频场景,这个优化立竿见影。

















