setlength是stringbuilder最轻量的清空或截断方式,通过修改count字段实现:setlength(0)快速清空且复用数组,setlength(n)可截断或填充\0;不改变capacity,需避免负数及多线程未同步。

setLength 是 StringBuilder 中最轻量、最直接的清空或截断方式,它不创建新对象,也不触发扩容/缩容逻辑,只是修改内部字符数组的“有效长度”(count 字段)。
用 setLength(0) 快速清空缓冲区
调用 setLength(0) 会立即将当前 StringBuilder 的有效长度设为 0,后续调用 toString()、length() 或 charAt() 都反映为空状态。注意:它不会释放底层 char 数组内存,但也不会影响后续追加——下次 append() 会从索引 0 开始覆盖写入。
- 比
new StringBuilder()更省内存和 GC 压力(复用已有数组) - 比
delete(0, length())更快(后者要校验参数并循环置零) - 适用于循环复用场景,比如日志拼接、SQL 构建等
用 setLength(n) 截断到指定长度
传入一个小于当前长度的正整数 n,StringBuilder 会丢弃从索引 n 开始的所有字符,且将 count 设为 n。若 n 大于当前长度,会用 \0(空字符)填充扩展部分(不常用,慎用)。
- 例如:
sb.append("hello world"); sb.setLength(5);→ 结果为"hello" - 截断后可继续
append(),新内容从位置n开始写入 - 避免用
setLength扩展(即 n > length),否则会引入不可见的 \0,可能引发字符串比较或序列化问题
注意事项与常见误区
setLength 操作是即时生效的,但它不改变底层 char 数组容量(capacity)。清空后 capacity 不变,所以多次 setLength(0) + append() 不会反复扩容,性能稳定。
- 不能用
setLength(-1)或负数,会抛StringIndexOutOfBoundsException - 清空后调用
sb.charAt(0)会抛异常(因为长度为 0),需先确认length() > 0 - 多线程环境下需自行同步,StringBuilder 本身不保证线程安全
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











