最常用且需对比的两种清空方式是setLength(0)和new StringBuilder():前者复用内存、适合高频循环拼接,后者开销大但适合单次或内容差异大的场景,delete(0,length())性能居中且非首选。

清空 StringBuilder 最常用也最值得对比的两种方式是 setLength(0) 和重新 new StringBuilder()。性能差异明显,关键不在“能不能用”,而在于“用在什么场景”。
setLength(0):复用内存,高频清空首选
它不创建新对象,也不释放底层数组,只是把内部长度计数器重置为 0。原 char 数组继续保留,后续 append 直接覆盖写入,避免了反复分配和 GC 压力。
- 适合循环内多次拼接(如批量日志、SQL 组装、HTTP 参数构建)
- 实测 JDK 17 下,比每次 new 快 90% 以上(临时对象创建开销大幅降低)
- 安全可靠:JDK 7u6 之后已修复 toString() 引用泄漏问题,无需额外担心
new StringBuilder():干净彻底,但开销大
每次都会分配新数组、初始化对象,旧实例交由 GC 回收。虽然语义清晰,但代价是对象创建 + 内存分配 + 后续 GC。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 适合单次使用、生命周期短、拼接内容差异极大(比如一会儿拼 10 字符,一会儿拼 10KB)
- 如果容量不可预估,且调用频次不高,new 反而更利于 GC 管理
- 默认构造容量仅 16,若未指定大小,首次拼接就可能触发扩容复制,进一步拉低效率
别忽略 delete(0, length()) 这个中间选项
它语义直观(“删掉全部”),但内部要做范围检查、逐字符清理,实际比 setLength(0) 慢不少。JMH 基准测试中通常排第三。
立即学习“Java免费学习笔记(深入)”;
- 不是清空的高效选择,但适合需要“删除某一段”的混合操作场景
- 如果代码可读性优先级高于几纳秒性能,且清空不频繁,也可接受
怎么选?看三点
不用死记硬背,按实际逻辑判断:
- 循环里反复拼接 → 用
setLength(0),实例提至循环外 - 方法内只拼一次,或每次内容量级悬殊 →
new StringBuilder(预估容量)更稳妥 - 不确定?先用
setLength(0),观察 GC 日志和吞吐量,再调整


















