java中stringbuilder截取和修改应直接操作内部字符序列,使用delete()、replace()、setcharat()等方法实现高效原地操作;无直接截取返回新stringbuilder的方法,需组合delete()或用substring()重建;replace()用于安全替换区间内容,setcharat()用于单字符修改。

Java中用StringBuilder做截取和修改,关键不是调用substring()(它返回String),而是直接操作内部字符序列——用delete()、replace()、setCharAt()等方法,既高效又不破坏可变性。
截取指定范围并保留结果
StringBuilder本身没有“截取后返回新StringBuilder”的方法,但可以组合delete()实现原地裁剪:
- 保留前n个字符:先获取长度,再删除从n开始的所有字符 ——
sb.delete(n, sb.length()) - 保留中间一段(如索引2到6):先删开头,再删结尾 ——
sb.delete(0, 2).delete(4, sb.length())(注意第二次删除的起始位置已变化) - 更稳妥的做法是先提取子串再重建:
new StringBuilder(sb.substring(start, end)),适合需要新对象且不介意一次字符串拷贝的场景
安全替换某段内容
replace(int start, int end, String str)是最常用的修改方式,它会删除[start, end)区间字符,插入str,自动处理长度变化:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 把第3–5位换成"XYZ":
sb.replace(2, 5, "XYZ")(索引从0开始,end不包含) - 想清空某段只留空格?传入空格字符串:
sb.replace(3, 7, " ") - 若start或end越界会抛
StringIndexOutOfBoundsException,建议提前校验:Math.min(start, sb.length())等处理边界
单字符修改与插入
对个别位置微调,优先用轻量级方法:
- 改一个字符:
sb.setCharAt(index, 'X'),要求index必须合法(0 ≤ index - 在末尾加内容:
sb.append("abc"),比insert(length, "abc")语义更清晰 - 在中间插入:
sb.insert(5, "new"),相当于在索引5处“撑开”空间填入字符 - 删除单个字符:
sb.deleteCharAt(3),比delete(3, 4)更直观
避免常见陷阱
几个容易出错的点要特别注意:
-
substring()返回的是String,不是StringBuilder —— 后续调用append()等会报错,需显式包装:new StringBuilder(sb.substring(...)) - 所有修改方法均改变原对象,无副本;如需保留原始值,创建时用
new StringBuilder(original)复制一份 - 多线程环境下StringBuilder不安全,应改用StringBuffer,或用局部变量确保单线程操作
- 频繁调用
toString()不会影响内部状态,但每次都会新建String对象,大量使用时注意GC压力
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










