setlength方法用于修改stringbuilder逻辑长度而非截取字符串:setlength(0)可高效清空,setlength(n)仅能缩短或填充,无法替代substring实现任意截取,其设计目标是缓冲区重用。

setLength 方法不是用来“截取”字符串的,而是直接修改 StringBuilder 内部字符数组的逻辑长度,可以实现快速清空或缩短内容,但不能像 substring 那样任意截取中间部分。
setLength(0) 快速清空缓冲区
这是最常用也最高效的方式清空 StringBuilder 的全部内容:
- 不创建新对象,不触发扩容/缩容,仅重置 length 字段
- 原有字符数组仍被持有,后续 append 会直接覆盖对应位置
- 比
new StringBuilder()或delete(0, length())更轻量
StringBuilder sb = new StringBuilder("Hello World");<br>sb.setLength(0); // 现在 sb.toString() 返回 ""<br>sb.append("Hi"); // 结果是 "Hi"
setLength(n) 缩短到前 n 个字符
当 n 小于当前长度时,相当于“从末尾裁掉多余部分”:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- n 必须 ≥ 0,否则抛
IndexOutOfBoundsException - n 超过当前长度时,会用 '\u0000'(空字符)填充扩展部分(极少用)
- 它只改变逻辑长度,原数组未被复制或截断,内存未释放
StringBuilder sb = new StringBuilder("Java Programming");<br>sb.setLength(4); // 变成 "Java"<br>sb.setLength(10); // 变成 "Java\0\0\0\0\0"(注意:不可见空字符)
不能替代 substring 或 delete 实现任意截取
如果想取中间子串(如第 3 到第 7 个字符),setLength 不适用,应使用:
-
sb.substring(start, end)→ 返回 String(推荐,语义清晰) -
sb.delete(end, sb.length()).delete(0, start)→ 原地修改(少用,效率低)
setLength 的设计目标是“重用缓冲区”,不是字符串切片工具。
注意事项和常见误用
- 调用 setLength 后,若再调用
toString(),返回的字符串不包含超出新长度的字符,安全 - 但内部 char[] 可能仍保留旧数据,涉及敏感信息时建议配合
setLength(0)+ensureCapacity(16)控制内存 - 不要依赖 setLength(n) 来“隐藏”数据——未覆盖的字符仍在数组里,可能被反射或内存分析看到
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










