题目
循环中字符串拼接的性能优化
信息
- 类型:问答
- 难度:⭐
考点
字符串拼接性能,StringBuilder使用,循环优化
快速回答
在循环中使用+拼接字符串会导致性能问题,因为每次操作都会创建新的String对象。优化方案:
- 使用
StringBuilder替代+操作符 - 预估容量初始化
StringBuilder(可选) - 避免在循环内重复创建
StringBuilder
原理说明
Java字符串是不可变对象。在循环中使用+拼接字符串时:
- 每次拼接都会创建新的
String对象 - 产生大量临时对象导致内存开销
- 频繁GC影响性能(时间复杂度O(n²))
StringBuilder使用可变字符数组,避免中间对象创建,时间复杂度为O(n)。
代码示例
// 错误做法(性能差)
String result = "";
for (int i = 0; i < 10000; i++) {
result += i; // 每次循环创建新String对象
}
// 正确做法(性能优)
StringBuilder sb = new StringBuilder(); // 单次创建
for (int i = 0; i < 10000; i++) {
sb.append(i); // 修改内部字符数组
}
String result = sb.toString();最佳实践
- 始终在循环中使用
StringBuilder:适用于多线程环境则用StringBuffer - 预估容量:
new StringBuilder(预估长度)减少数组扩容次数 - 链式调用:
sb.append("a").append("b")更高效
常见错误
- 在循环内重复创建
StringBuilder:for(...) { StringBuilder sb = new StringBuilder(); } - 误用
+拼接非循环场景:单行拼接如String s = "a" + b;会被编译器优化为StringBuilder - 多线程场景未使用
StringBuffer
扩展知识
- JDK优化:Java 9+使用
invokedynamic优化字符串拼接,但循环场景仍需StringBuilder - 容量管理:
StringBuilder默认容量16,扩容代价高(新建数组+数据拷贝) - 性能对比:万次循环拼接测试中,
StringBuilder比+快100倍以上