setlength 是 stringbuilder 中高效截断或清空内容的原地操作方法:setlength(0) 快速清空但不释放内存;setlength(n) 可截取前 n 字符或扩容填充 '\u0000',但需注意边界、代理对及未初始化区域访问风险。

setLength 是 StringBuilder 中一个直接操作内部字符缓冲区长度的方法,它不创建新对象,也不涉及字符串解析,主要用于**高效截断或清空内容**,但使用时需注意边界和逻辑含义。
setLength(0) —— 快速清空 StringBuilder
调用 setLength(0) 会将当前字符序列长度设为 0,但**不释放底层 char 数组内存**。效果等价于 delete(0, length()),但更轻量。
- 清空后
length()返回 0,toString()返回空字符串"" - 后续追加(如
append("abc"))会从索引 0 开始写入,复用原有数组空间 - 比新建
new StringBuilder()更省内存和 GC 压力,适合循环复用场景
setLength(n) 截取前 n 个字符(n
当传入的 n 小于当前长度时,相当于“砍掉”末尾多余部分,只保留前 n 个字符。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 例如:
sb = new StringBuilder("hello"); sb.setLength(3);→ 内容变为"hel" - 该操作是原地修改,不检查
n是否合法(如负数或超界),越界会抛IndexOutOfBoundsException - 不同于
substring(0, n),它不生成新字符串对象,也不影响底层数组大小
setLength(n) 扩容填充(n > current length)
当 n 大于当前长度时,StringBuilder 会将新增位置(从原 length 到 n−1)用 '\u0000'(Unicode 空字符)填充。
- 例如:
sb = new StringBuilder("a"); sb.setLength(5);→ 内容变成"a\u0000\u0000\u0000\u0000" - 此时
length()为 5,但toString()仍包含不可见的空字符,打印可能显示异常或被截断 - 一般不推荐主动扩容用此方法,应优先使用
append()或ensureCapacity()
注意事项与常见误用
这个方法容易被当成“安全截取工具”,但其实有隐含风险:
- 不校验参数:传负数或超过
capacity()会直接抛异常 - 不处理 Unicode 补充字符:若截断位置落在代理对(surrogate pair)中间,会导致字符串损坏
- 清空后未重置状态:如果后续依赖
sb.length() == 0判断是否为空,setLength(0)是安全的;但若误以为容量也归零,就错了(capacity()不变) - 避免混用:不要在
setLength(n)后立即用charAt(i)访问未初始化区域(n 之后),除非你明确知道填充的是'\u0000'
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










