setlength(0)是清空stringbuilder最轻量高效的方式,不新建对象、不触发gc,仅重置逻辑长度;setlength(n)可截断或填充,适用于日志裁剪等场景,但需注意内存复用与线程安全。

StringBuilder 的 setLength 方法是清空或截断字符串缓冲区最轻量、最高效的方式,无需新建对象,也不触发 GC。
setLength(0) 是最快清空 StringBuilder 的方法
调用 setLength(0) 会将内部字符数组的逻辑长度设为 0,但不释放底层 char 数组内存。后续追加内容时直接复用原有空间,避免重复扩容。
- 比
new StringBuilder()更省内存——跳过对象创建和数组分配开销 - 比
delete(0, length())更简洁——一行代码,语义明确 - 比
toString().length() == 0判断后重建更高效——原地操作,无字符串拷贝
用 setLength(n) 截断到指定长度
传入小于当前长度的正整数 n,可保留前 n 个字符,丢弃其余部分。适用于动态裁剪日志、截取前缀、实现简易缓冲控制等场景。
- 若 n 大于当前长度,会用 '\u0000'(空字符)填充至该长度(一般不推荐)
- 截断后
length()和capacity()不变,仍保持原容量 - 例如:
sb.append("hello world").setLength(5);后内容为 "hello"
注意事项与常见误用
setLength 不改变底层数组大小,也不重置 capacity,因此需注意实际使用意图:
- 清空后立即 append,不会影响性能;但长期只清空不重用,可能浪费内存(可配合 ensureCapacity 调整)
- 不要依赖截断后的 '\u0000' 字符——它不是可见空格,
toString()会按实际 length 截断,不会包含 '\u0000' - 多线程下必须自行同步——StringBuilder 本身不保证线程安全
对比其他清空方式的性能差异
在高频循环中反复构建字符串时,性能差距明显:
-
setLength(0):约 5–10 ns,纯指针操作 -
delete(0, length()):约 20–40 ns,涉及数组复制逻辑 -
sb = new StringBuilder():约 30–60 ns,含对象分配和初始化开销
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











