stringbuilder内存效率高于string,因其复用同一块内存动态扩容而非反复新建对象;string不可变,每次拼接都生成新对象并复制内容,导致大量临时对象和gc压力;stringbuilder通过可变字符数组就地修改,仅少量扩容,内存占用可控且gc干扰极小。

StringBuilder 比 String 内存效率高,核心在于「复用内存」而非「反复新建」。
String 每次拼接都分配新对象
String 不可变,任何修改(如 +=、concat())都会创建全新对象:
- 原字符串内容被完整复制到新对象中
- 旧对象留在堆中,等待 GC 回收
- 循环拼接 10000 次 → 生成约 10000 个临时 String 对象
- 频繁触发 Young GC,甚至可能引发 Full GC
StringBuilder 在同一块内存上动态扩容
它内部维护一个可变的字符数组(JDK9+ 是 byte[]),所有操作就地修改:
- 默认初始容量为 16,足够应对多数短字符串拼接
- 超出时按公式扩容:新容量 = 原容量 × 2 + 2,避免频繁扩容
- append、insert、delete 等操作不产生新对象,只更新数组内容和长度
- 整个过程通常只分配 1~3 次数组(取决于总长度),内存压力极小
实际内存占用差异明显
以拼接 10 万个数字字符串为例:
- String +=:累计分配数万字节内存,大量碎片化对象
- StringBuilder:起始 16 字节数组,最终扩容 2~3 次,总内存占用可控,无中间对象残留
- GC 日志中可见:String 方式出现多次 GC pause;StringBuilder 几乎无 GC 干扰
额外优化点:避免无谓扩容
如果能预估最终长度,建议显式指定初始容量:
-
new StringBuilder(1024)比默认 16 更省空间和时间 - 尤其适合构造日志、JSON、SQL 等已知大致长度的场景
- 减少数组拷贝次数,提升吞吐量
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











