stringbuilder的setlength方法通过调整逻辑长度高效裁剪或清空内容,不创建新对象、不触发gc;设为0可复用对象,设为n可截断或补\u0000,但负数抛异常、超容不扩容、非线程安全。

StringBuilder 的 setLength 方法可以快速裁剪或清空内容,本质是调整内部字符数组的逻辑长度,不创建新对象,也不改变底层数组大小。
用 setLength(0) 清空 StringBuilder
调用 setLength(0) 会将当前 StringBuilder 的有效字符数设为 0,后续调用 toString() 或 length() 都返回空字符串和 0。底层数组仍保留(避免频繁扩容/回收),适合循环复用。
- 比
new StringBuilder()更轻量,尤其在循环中反复构建字符串时 - 比
delete(0, length())更简洁,语义更明确 - 不会触发 GC,也不会丢弃已分配的容量
用 setLength(n) 裁剪到指定长度
传入小于当前长度的正整数 n,会截断末尾字符,只保留前 n 个字符。若 n 大于当前长度,会在末尾补 \u0000(空字符),但这些空字符不影响 toString() 输出(Java 字符串不包含结尾 \u0000)。
- 例如:
sb.append("hello world").setLength(5)→"hello" - 注意:补零仅影响内部 char[],
toString()始终按实际长度截取,不会输出 \u0000 - 不推荐用 setLength 扩容来“预占位”,应优先用
ensureCapacity()或构造时指定容量
注意事项和常见误区
setLength 是一个底层操作,需注意边界和副作用:
- 传入负数会抛
IllegalArgumentException - 传入大于当前容量的值,不会自动扩容,而是直接补 \u0000 —— 但此时
length()返回的是你设的值,capacity()不变 - 如果之后追加内容,从新 length 位置开始写,中间的 \u0000 不会被覆盖,除非显式赋值
- 多线程环境下非线程安全,需外部同步
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











