StringBuilder没有substring方法,因其设计目标是高效可变操作,而substring属于不可变字符串的视图提取,JDK开发者认为应由String完成;正确做法是先toString()再调用substring,注意endIndex为不包含的右边界。

StringBuilder 本身没有 substring 方法,但你可以先调用 toString() 转成 String,再用 String 的 substring(int beginIndex, int endIndex) 截取。
为什么 StringBuilder 没有 substring 方法?
StringBuilder 是可变字符序列,设计目标是高效拼接、修改;而 substring 属于不可变字符串的“视图提取”操作。JDK 开发者认为这类操作更适合在 String 上完成,避免在可变对象上引入语义混淆。
正确用法:转成 String 后截取
这是最常用、最安全的方式:
- 确保索引合法(
0 ≤ beginIndex ≤ endIndex ≤ length()),否则抛StringIndexOutOfBoundsException - 注意:
endIndex是**不包含**的右边界(和 String 一致) - 示例:
StringBuilder sb = new StringBuilder("HelloWorld");
String sub = sb.toString().substring(5, 10); // "World"
想避免临时 String 对象?用 char 数组手动复制
如果性能极端敏感(如高频循环中),且确定只读使用,可跳过 toString:
立即学习“Java免费学习笔记(深入)”;
- 调用
sb.getChars(srcBegin, srcEnd, dst, dstBegin)复制到目标 char[] - 再用
new String(charArray, offset, length)构造子串 - 示例:
StringBuilder sb = new StringBuilder("HelloWorld");
int start = 5, end = 10;
char[] buf = new char[end - start];
sb.getChars(start, end, buf, 0);
String sub = new String(buf); // "World"
别误用 StringBuffer 或 StringBuilder 的 delete / replace 代替截取
有人试图用 delete(0, start).delete(end - start, sb.length()) “原地截取”,这会破坏原始 StringBuilder,且效率更低、逻辑易错。除非你确实想修改原对象并只保留子串,否则不推荐。


















