StringBuilder 更快是因为 String 不可变,每次+拼接都新建对象,而 StringBuilder 基于可变数组,避免重复创建,时间复杂度从 O(n²) 降至 O(n),内存分配和 GC 压力显著降低。

在 Java 中,用 + 操作符在循环内拼接字符串会导致严重性能问题,因为每次拼接都会创建新的 String 对象(String 不可变),产生大量临时对象和内存开销。改用 StringBuilder 可显著提升效率——它内部基于可变字符数组,避免重复创建对象。
为什么 StringBuilder 更快?
String 是不可变类,每次 + 拼接都等价于新建一个 String,底层可能调用 StringBuilder.append().toString();而 StringBuilder 在单线程场景下直接操作内部 char[] 数组,仅在容量不足时扩容(默认初始容量 16,按需翻倍)。这意味着:
- 时间复杂度从 O(n²) 降为 O(n)
- 堆内存分配次数大幅减少
- GC 压力明显降低
正确使用 StringBuilder 的关键写法
-
提前预估容量:若知道最终字符串大致长度,构造时指定容量(如
new StringBuilder(1024)),避免多次扩容复制数组 -
复用同一实例:在循环外创建
StringBuilder,循环内只调用.append(),最后统一.toString() -
避免在循环中反复 toString():不要在每次迭代都调用
sb.toString(),这会失去优化意义 -
注意线程安全需求:多线程环境下应改用
StringBuffer(方法同步),但单线程优先选StringBuilder
对比示例:低效 vs 高效
❌ 低效写法(循环内用 +):
String result = "";<br>for (int i = 0; i < 10000; i++) {<br> result += "item" + i;<br>}<br>✅ 高效写法(复用 StringBuilder):
StringBuilder sb = new StringBuilder(64000); // 预估容量<br>for (int i = 0; i < 10000; i++) {<br> sb.append("item").append(i);<br>}<br>String result = sb.toString();<br>进阶提示:何时不用 StringBuilder?
不是所有拼接都需要手动优化:
- 编译期常量拼接(如 "a" + "b" + "c")会被编译器自动优化为单个字符串字面量
- 少量(如 2~3 次)、非循环内的拼接,JVM 通常也会自动使用 StringBuilder 优化,无需手动干预
- 使用 String.join() 或 String.formatted() 等现代 API 时,内部已做优化,可直接使用


















