循环中拼接字符串应使用StringBuilder而非+或+=,因String不可变会导致大量临时对象和GC压力;需预估容量初始化、循环中仅调用append()、最后toString()。

在循环中拼接字符串,直接用 + 或 += 会产生大量临时 String 对象,性能差、内存开销大。推荐用 StringBuilder,它可变、线程不安全但高效,特别适合循环内累积字符串。
为什么循环里不用 String += ...
String 是不可变的。每次 str += "abc",实际是创建一个新对象,把旧内容和新增内容复制进去,原对象被丢弃。循环 1000 次,就生成 1000 个中间 String,GC 压力明显增大。
用 StringBuilder 替代的正确写法
先创建一个 StringBuilder 实例(最好预估容量),在循环中反复调用 append(),最后用 toString() 得到结果字符串。
- 初始化时尽量指定初始容量,避免内部数组多次扩容(例如:
new StringBuilder(1024)) - 循环体内只调用
append(),支持多种类型(String、int、boolean等),无需手动转字符串 - 循环结束后再调用一次
toString(),不要在循环里反复调用它
常见错误与优化点
以下写法容易踩坑:
- 在循环里每次都新建
StringBuilder:失去累积意义,反而更慢 - 不设初始容量,且拼接内容很长:触发多次
char[]扩容(每次约 1.5 倍增长) - 混用
String和StringBuilder拼接,比如sb.append("a" + i):括号内"a"+i又触发了String拼接 - 多线程环境误用:若多个线程共用同一个
StringBuilder,需同步或改用StringBuffer
一个典型示例
比如把列表中的姓名用逗号连接:
List<string> names = Arrays.asList("Alice", "Bob", "Charlie");
StringBuilder sb = new StringBuilder(names.size() * 16); // 预估容量
for (int i = 0; i 0) sb.append(", ");
sb.append(names.get(i));
}
String result = sb.toString(); // "Alice, Bob, Charlie"
</string>Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











