StringBuilder的setLength方法通过直接修改内部字符数组的有效长度实现截断或扩容:当newLength小于当前长度时截断末尾字符,大于时在新增位置填充'\u0000';它不创建新对象、无返回值、不触发回调,性能高但需注意空字符处理。

StringBuilder 的 setLength 方法不是“裁剪字符串”,而是直接修改内部字符数组的有效长度,可能截断、也可能扩容(补空字符)。 它操作的是 StringBuilder 对象本身的容量视图,不创建新对象,也不校验内容合法性。
它怎么“裁剪”(实际是截断)?
当传入的 newLength 小于当前长度(length())时,StringBuilder 会把有效长度设为 newLength,丢弃后面所有字符。原底层 char 数组没变,但 toString() 或 charAt() 等方法只认新长度范围内的内容。
- 例如:
sb = new StringBuilder("hello"); sb.setLength(3);→sb.toString()返回"hel" - 注意:这不是删除操作,不触发任何回调或事件;也没有返回值,是就地修改
它还能“扩容”?
如果 newLength 大于当前长度,StringBuilder 会把有效长度设为该值,并在新增位置上填充 '\u0000'(Unicode 空字符)。这些位置可后续写入,但直接转成 String 后会包含不可见的空字符。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 例如:
sb = new StringBuilder("hi"); sb.setLength(5);→sb.toString()是"hi\u0000\u0000\u0000" - 这种用法少见,通常应优先用
append;若真需要,记得后续用setCharAt填充有效内容
和 substring 或 delete 有什么区别?
setLength 更轻量,但语义不同:
立即学习“Java免费学习笔记(深入)”;
-
substring(0, n)返回新 String,原 StringBuilder 不变 -
delete(n, length())是明确的删除动作,逻辑清晰,推荐用于“裁剪后继续使用”的场景 -
setLength(n)最快,适合性能敏感且确定要永久缩短的场合(如复用 StringBuilder 缓冲区)
使用注意事项
调用前最好检查参数,避免异常或意外行为:
- 传负数会抛
IndexOutOfBoundsException - 传大于
capacity()的值会触发扩容(自动增长底层数组),但新增部分仍是'\u0000' - 如果之后要把结果当普通字符串用,建议紧接着调用
toString().trim()或手动清理空字符

















