应使用stringbuilder替代+或+=拼接字符串,尤其在循环中;因string不可变,每次+都会创建新对象并增加gc压力,而stringbuilder基于可变字符数组,append()仅追加内容且支持预设容量以减少扩容,性能显著更优。

直接用 StringBuilder 替代 + 或 += 拼接字符串,尤其在循环中,能显著避免频繁创建临时字符串对象,提升性能。
为什么循环里不用 + 拼接?
Java 中字符串是不可变的。每次用 + 拼接,都会生成一个新 String 对象,旧对象等待 GC。循环 1000 次,可能产生上千个中间字符串,内存和时间开销明显增大。
而 StringBuilder 是可变的,内部用字符数组缓存内容,append() 只是在数组末尾追加,扩容也按需进行(默认容量 16,不够时翻倍),效率高得多。
基本用法:初始化、append、toString
- 创建时建议指定初始容量(如预估最终长度),减少扩容次数。例如:
new StringBuilder(1024) - 循环中反复调用
append(),支持字符串、数字、布尔、字符等多种类型 - 循环结束后,用
toString()获取最终字符串——注意这不是自动调用的,必须显式写
示例:
StringBuilder sb = new StringBuilder(256);for (String s : list) {
sb.append("Item: ").append(s).append("; ");
}
String result = sb.toString(); // 关键一步,别漏了
进阶注意点
- 多线程场景下不要共享同一个
StringBuilder实例;如需线程安全,改用StringBuffer(但会稍慢) - 如果循环体里有分支逻辑(如条件拼接),仍可用
append()配合 if,无需拆成多个 builder - 拼接完可调用
setLength(0)清空内容复用 builder(比新建更省),但要确保没有其他引用指向它
对比小测试(直观感受)
拼接 10 万次短字符串:
- 用
+=:通常耗时几百毫秒,GC 压力明显 - 用
StringBuilder(合理预设容量):通常几毫秒内完成
差异随数据量增大而急剧放大,实际业务循环(如日志组装、SQL 拼接、HTML 生成)中效果立竿见影。










