stringbuilder截取需用setlength()或delete()原地修改:setlength(n)高效截断末尾,delete()可任意区间截取;操作不可逆、非线程安全,适合大字符串高频裁剪场景。

Java 中 StringBuilder 本身不提供直接的“截取”方法,但可以通过 delete() 和 setLength() 配合实现高效、原地修改式的字符串截取,避免创建新对象,比 String.substring() 更节省内存和时间。
用 setLength() 快速截断末尾
如果只需要保留前 n 个字符(即从索引 0 到 n-1),setLength(n) 是最轻量的方式。它直接调整内部字符数组的有效长度,不涉及复制或新建对象。
- 要求
n ≥ 0且n ≤ length(),否则抛出IndexOutOfBoundsException - 执行后原 StringBuilder 对象被修改,后续操作基于新长度
- 例如:
sb.setLength(5)将字符串截为前 5 个字符
用 delete() 实现任意区间截取
若需保留中间某段(如从 start 到 end-1),可先删除开头多余部分,再删除末尾多余部分。两次 delete() 调用仍比生成多个 String 对象更高效。
- 先
delete(0, start)删除起始位置前的内容 - 再
delete(end - start, length())删除剩余部分中超出 end 的内容(注意此时长度已变) - 更稳妥写法:先记录原始长度,再按相对位置删——
sb.delete(end, sb.length()).delete(0, start)
注意不可逆性与线程安全
所有 StringBuilder 截取操作都是就地修改,原内容丢失,无法撤销。同时 StringBuilder 不是线程安全的,多线程环境下需外部同步或改用 StringBuffer(但会牺牲性能)。
- 如需保留原始内容,应先调用
new StringBuilder(sb)复制一份再操作 - 频繁截取+拼接场景下,避免反复
delete()导致内部数组频繁缩容,必要时可手动trimToSize() - 截取后若继续追加,StringBuilder 会自动扩容,无需额外处理
对比 String.substring 的实际收益
对大字符串(如数万字符以上)或高频截取场景,StringBuilder 方式优势明显:无新 String 对象产生,不触发字符串常量池或 GC 压力;但对短字符串,JVM 优化已很成熟,差异可忽略。
-
String.substring()在 Java 7u6 之后已不再共享底层数组,每次都会拷贝字符,有开销 - StringBuilder 截取本质是调整指针和长度字段,接近 O(1) 时间复杂度
- 适合构建过程中动态裁剪,比如日志拼接、协议报文组装等场景
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











