stringbuilder无直接截取方法,可通过tostring().substring()获取子串(不修改原对象),或用delete()、java19+的deleterange()原地截取;需注意索引越界校验与unicode码点计数。

StringBuilder 本身没有直接的“截取”方法,但可以通过 substring()(返回 String)或 delete() + deleteRange()(原地修改)来实现字符串截取效果。
用 substring() 获取子字符串(不改变原 StringBuilder)
虽然 StringBuilder 没有 substring(int start, int end) 方法,但它继承自 AbstractStringBuilder,并重写了 toString();因此最常用的方式是先转成 String,再调用 String.substring():
String result = sb.toString().substring(start, end);- 注意:
start和end是字符索引,end不包含(左闭右开),且不能越界(否则抛StringIndexOutOfBoundsException) - 该方式安全、直观,适合只需读取片段、不修改原内容的场景
用 delete() 实现“前截”或“后截”(原地修改)
若需直接修改 StringBuilder 内容(比如只保留前 N 个字符或去掉开头 M 个),可用 delete() 配合长度判断:
- 保留前
n个字符:sb.delete(n, sb.length()); - 去掉前
m个字符:sb.delete(0, m); - 保留中间 [start, end) 区间:
sb.delete(0, start).delete(end - start, sb.length() - start);
注意:两次 delete() 会改变后续索引,第二步的删除起点需按当前长度重新计算。
Java 19+ 新增 deleteRange()(更简洁的中间截取)
从 Java 19 开始,StringBuilder 新增了 deleteRange(int start, int end) 方法,语义与 String.substring() 的区间一致,可用于高效“挖掉”一段:
- 例如:想保留开头和结尾,去掉中间 [5,10),可写
sb.deleteRange(5, 10); - 它等价于
delete(start, end),但命名更清晰,且明确支持start ≤ end,start == end时无操作 - 若目标是“截取”,即只留 [start, end),则先
delete(0, start),再deleteRange(end - start, sb.length())
避免常见错误
实际使用中容易踩坑的地方:
- 混淆
StringBuilder.length()(字符数)和字节数 —— 截取始终按 Unicode 码点计数,不是 byte - 传入负数或超过
length()的索引会立即抛异常,建议提前校验:if (start sb.length() || start > end) {...} - 不要误用
setLength()替代截取:它只能缩容到指定长度(类似 truncate),不能取中间段
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











