加号拼接效率低是因为string不可变,每次+都会创建新对象,循环中产生大量临时对象触发频繁gc;stringbuilder通过复用可变数组、预估容量和单次tostring()将时间复杂度从o(n²)降至o(n),显著减少内存分配与gc压力。

Java 中用 StringBuilder 替代 + 拼接,核心是避免创建大量临时 String 对象,提升性能,尤其在循环或多次拼接场景下效果明显。
为什么加号拼接效率低?
Java 中字符串是不可变的(immutable)。每次用 + 拼接两个字符串,都会生成一个新 String 对象。例如:
编译器会优化为单次拼接(JDK 8+ 常量折叠),但若涉及变量或运行时值(尤其是循环中),就会变成:
s = new StringBuilder().append("a").append(b).append(c).append(d).toString();——而你手动用 StringBuilder,能复用同一个对象,省去反复构造/销毁开销。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
怎么正确使用 StringBuilder?
-
初始化时预估容量:避免内部数组频繁扩容。例如拼接 100 个平均长度 10 的字符串,可设初始容量
new StringBuilder(1000) -
复用同一实例:不要在循环外新建、循环内反复
new;应在循环前创建,循环中调用append() - 及时调用 toString():只有需要最终字符串时才调用,避免过早转换丢失可变性
-
注意线程安全:
StringBuilder非线程安全;多线程需用StringBuffer(但性能略低)
典型替换示例
❌ 低效写法(循环中用 +):
for (String s : list) {
result += s; // 每次都新建 String 对象
}
✅ 推荐写法(用 StringBuilder):
StringBuilder sb = new StringBuilder();for (String s : list) {
sb.append(s);
}
String result = sb.toString();
更进一步,如果已知集合大小,还可预设容量:
StringBuilder sb = new StringBuilder(list.size() * 16); // 假设平均长度约 16哪些情况不用强行替换?
- 拼接次数极少(如固定 2~3 次),且不含循环,编译器会自动优化为
StringBuilder,无需手动改 - 使用字符串常量拼接(如
"a" + "b" + "c"),编译期直接合并为字面量 - 代码可读性优先且性能非瓶颈时,简洁的
+更易维护
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










