stringbuilder的replace方法直接修改内部字符数组,不创建新对象,效率高;它按左闭右开区间替换,要求0≤start≤end≤length(),否则抛异常;相比delete+insert,replace为原子操作,仅一次数组拷贝。

StringBuilder 的 replace 方法是直接修改内部字符数组的,不产生新对象,所以效率很高。 它通过指定起始索引(含)和结束索引(不含)来定位区间,用给定字符串覆盖该范围,原 StringBuilder 实例被就地更新。
replace 方法的基本用法
调用形式为 sb.replace(start, end, str),其中:
- start:要替换的起始位置(从 0 开始,包含该索引)
- end:要替换的结束位置(不包含该索引,即左闭右开区间)
- str:用于替换的新字符串(可以为空、更短或更长)
例如:new StringBuilder("HelloWorld").replace(5, 10, "Java") → 结果为 "HelloJava"(索引 5~9 的 "World" 被替换成 "Java")。
注意索引边界与越界处理
start 和 end 必须满足 0 ≤ start ≤ end ≤ length(),否则抛出 StringIndexOutOfBoundsException。常见安全写法:
- 用
Math.min(start, sb.length())防止 start 超长 - 用
Math.min(end, sb.length())截断 end - 若 start > sb.length(),可提前 return 或 throw 自定义提示
实际开发中建议先校验再操作,尤其当索引来自用户输入或计算结果时。
高效替换的关键点
相比先 delete 再 insert,replace 是原子操作,内部只做一次数组拷贝(如果新内容长度不同),避免了两次移动开销:
- 新字符串长度 = 原区间长度 → 仅逐个赋值,最快
- 新字符串长度
- 新字符串长度 > 原区间长度 → 扩容判断 + 数组复制,但仍比 delete+insert 少一次 shift
因此,只要区间明确,优先用 replace,而不是组合 delete、insert 或 substring 拼接。
结合 indexOf 动态定位后替换
常需先找到目标子串位置再替换,推荐链式写法:
- 用
sb.indexOf("old")获取起始索引 - 检查返回值是否 ≥ 0,再算
end = start + "old".length() - 调用
sb.replace(start, end, "new")
注意:indexOf 只匹配第一个;如需全部替换,可用循环或考虑用 String 的 replaceAll(但会新建对象,不适合高频修改场景)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











