stringbuilder 更快是因为 string 不可变,每次 + 都新建对象并触发 gc,而 stringbuilder 复用 char 数组,append 仅写入末尾,扩容也按需翻倍;预设容量、循环后 tostring、单线程用 stringbuilder 可最大化性能。

直接用 + 拼接字符串在循环里会严重拖慢性能,因为每次拼接都创建新对象;用 StringBuilder 在堆上复用可变缓冲区,能显著提升效率。
为什么 StringBuilder 更快?
Java 中 String 是不可变的,每次 + 操作都会生成新对象,循环 10000 次就新建 10000 个字符串对象,触发频繁 GC。而 StringBuilder 内部维护一个 char 数组,append() 只是往数组末尾写入数据,扩容也只在必要时发生(默认初始容量 16,翻倍增长),避免了大量对象分配。
正确初始化容量,避免多次扩容
如果知道最终字符串大致长度,提前指定容量能减少数组复制次数。比如拼接 100 个平均长度为 20 的字符串,预估总长 2000 字符,就设初始容量为 2000 或略大:
StringBuilder sb = new StringBuilder(2000);- 不指定容量时,小字符串反复
append可能触发 3–5 次扩容(16 → 32 → 64 → 128 → …),影响性能
循环中只 append,别 toString() 太早
把 toString() 放在循环结束后调用一次即可。如果在循环里每轮都调用,等于每次都生成新 String 对象,白费了 StringBuilder 的优势:
- ✅ 正确:
for (String s : list) { sb.append(s); } return sb.toString(); - ❌ 错误:
for (String s : list) { result = sb.append(s).toString(); }
注意线程安全场景选 StringBuffer
StringBuilder 是非线程安全的,适合单线程场景(绝大多数情况);如果多个线程共用同一个实例,应改用 StringBuffer(方法加了 synchronized)。但更推荐每个线程独立创建 StringBuilder,避免锁竞争。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











