直接调用setLength(0)是最高效、最推荐的清空StringBuilder方式,因其不创建新对象、不触发数组扩容、仅重置长度为0,避免GC压力并复用底层数组。

直接调用 setLength(0) 是最高效、最推荐的方式清空 StringBuilder 的内部缓冲区并重用对象。
为什么不用 new StringBuilder() 重新创建?
频繁新建对象会增加 GC 压力,尤其在循环或高频调用场景中。StringBuilder 内部使用 char[] 数组存储内容,只要容量足够,清空后复用可避免重复分配数组内存。
setLength(0) 是标准且安全的做法
该方法将字符长度设为 0,但不改变底层数组容量,后续 append、insert 等操作会从索引 0 开始覆盖写入:
- 不会触发数组扩容或缩容
- 不修改内部 char[] 引用,无额外对象创建
- 线程不安全,但符合 StringBuilder 的设计定位(单线程使用)
StringBuilder sb = new StringBuilder(128); // 预分配容量<br>sb.append("hello");<br>System.out.println(sb.toString()); // "hello"<br>sb.setLength(0); // 清空,长度变为 0<br>System.out.println(sb.length()); // 0<br>sb.append("world");<br>System.out.println(sb.toString()); // "world"
立即学习“Java免费学习笔记(深入)”;
其他方式对比(不推荐)
- sb.delete(0, sb.length()):语义清晰但多一次范围检查,性能略低于 setLength(0)
- sb = new StringBuilder(sb.capacity()):丢弃原对象,产生垃圾,违背“重用”初衷
- sb.replace(0, sb.length(), ""):底层调用 delete + insert,开销更大
注意容量和实际长度的区别
清空后 length() 返回 0,但 capacity() 保持不变。如果后续追加内容远超原容量,仍会自动扩容;若长期只处理短字符串,可结合 ensureCapacity() 或构造时预估容量来减少扩容次数。


















