setlength只改变stringbuilder的逻辑长度而不影响底层容量;截断时丢弃末尾字符,扩展时用'\0'填充;真要缩容需重建实例如new stringbuilder(sb.tostring())。

setLength 不是调整 StringBuilder 的缓冲区大小,而是控制其**逻辑长度**(即有效字符数),底层容量(capacity)通常不变。
setLength 作用:截断或扩展内容
调用 setLength(int newLength) 会改变 StringBuilder 当前表示的字符串长度:
- 如果 newLength :丢弃末尾多余字符(逻辑上截断,不释放内存)
- 如果 newLength > 当前长度:用 '\0'(空字符,Unicode U+0000)填充新增位置
- 如果 newLength == 当前长度:无实际变化
注意:它不会缩小底层 char 数组的容量,也不会触发扩容;只是修改 length 字段和部分数组内容。
如何真正减小底层容量?
StringBuilder 没有提供直接“收缩容量”的公开方法。若想释放多余空间,常用做法是:
- 用 new StringBuilder(toString()) 创建新对象(自动按当前内容长度分配最小容量)
- 或手动指定容量:new StringBuilder(当前长度),再 append 原内容
例如:
StringBuilder sb = new StringBuilder("Hello World");sb.setLength(5); // 变成 "Hello",但 capacity 仍很大
sb = new StringBuilder(sb.toString()); // 容量重置为约 16(默认)或刚好够存 "Hello"
setLength 的典型用途
它常用于复用 StringBuilder 实例,避免频繁创建对象:
- 清空内容:sb.setLength(0)(比 sb.delete(0, sb.length()) 更快)
- 覆盖式拼接:先 setLength(0),再 append 新内容
- 构造固定长度缓冲(如协议头、填充字段),再用其他方式填值
注意事项
使用 setLength 扩展时插入的 '\0' 是不可见控制字符,不是空格,也不影响 toString() 显示(Java 字符串以 '\0' 结尾不影响内容),但可能影响某些基于字节或逐字符处理的逻辑。
不要依赖 setLength 来“节省内存”,它不释放数组空间;真要缩容,必须重建实例。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











