stringbuilder需组合delete()与insert()等方法实现高效替换:精准位置替换用delete+insert;少量替换可用substring+concat;全局替换应从后往前循环lastindexof避免索引偏移;须避免tostring()转换等低效操作。

StringBuilder 本身不提供直接的“替换字符串”方法(比如 replaceAll),但可以通过组合已有方法高效完成字符或子串替换,关键在于避免创建多余对象、减少数组拷贝,并利用其可变性。
用 delete() + insert() 实现精准位置替换
当知道要替换的起始位置和长度时,这是最高效的方式——只操作内部 char 数组一次,不涉及搜索或遍历。
- 先调用 delete(start, end) 移除旧内容(注意 end 是开区间)
- 再用 insert(start, replacement) 插入新内容
- 例如:把索引 2~4 的字符替换成 "XY":
sb.delete(2, 4).insert(2, "XY")
用 substring + replace + concat 拆分拼接(适合少量替换)
对小规模、非循环场景,可读性高且足够快。注意不要在循环里频繁调用 substring,否则会生成多个 String 对象。
- 提取前段:
sb.substring(0, start) - 提取后段:
sb.substring(end) - 拼接:
new StringBuilder().append(前段).append(新内容).append(后段) - 适用于已知固定位置,且不想改变原 sb 引用时
用 indexOf 循环 + delete+insert 实现全局子串替换
StringBuilder 没有内置 replaceAll,但可以手动模拟,注意从后往前替换,避免索引偏移问题。
- 用 lastIndexOf(target) 找最后一个匹配位置
- 每次找到就 delete + insert,然后继续找前一个
- 这样不用调整索引,逻辑更稳;若从前向后找,每次替换后后续位置会变化
- 示例:替换所有 "ab" 为 "x",循环条件是
pos != -1
避免常见低效写法
有些写法看似简洁,实则触发多次扩容或隐式转换,拖慢性能。
- 不要写
sb.replace(start, end, str).toString()再重新 new StringBuilder——多此一举 - 避免在循环中反复调用
sb.toString().replace(...),这会丢弃 StringBuilder 的优势 - 慎用
sb.setCharAt(i, c)替换单个字符虽快,但无法处理长度变化的替换
核心原则是:能用原地修改就不用转成 String,能少拷贝就少拷贝,定位越精确,效率越高。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











