StringBuilder不支持直接部分更新,但可通过定位+delete+insert或setCharAt高效实现局部修改,需避免toString()、预设容量、复用实例以减少扩容和对象创建。

StringBuilder 本身不支持直接“部分更新”字符串(比如像数组那样按索引批量改写某一段),但可以通过 定位 + 替换/删除+插入 的组合操作高效完成局部修改,关键在于避免重复创建对象、减少内部数组扩容,并复用已有容量。
定位要修改的区间:用 substring 或直接操作索引
不要用 toString() 转成 String 再截取——这会额外创建对象。直接用 StringBuilder 的 charAt()、indexOf()、lastIndexOf() 定位起始和结束位置;若需提取子串做判断,可用 subSequence(start, end).toString()(开销较小,且不触发扩容)。
- 例如:把第5到第10位(含)替换为新内容,先确认
sb.length() >= 10 - 避免写
sb.toString().substring(5, 10),改用sb.subSequence(5, 10).toString()
高效替换一段:delete + insert 组合优于 replace
replace(int start, int end, String str) 内部就是先 delete 再 insert,但手动调用更可控。尤其当新内容长度与原段长度差异大时,可提前预估容量,减少数组复制。
- 先
sb.delete(start, end)删除旧内容(注意:end 是“不包含”的索引) - 再
sb.insert(start, replacement)插入新内容 - 如果新内容很长,且知道最终总长,可在初始化时用
new StringBuilder(initialCapacity)预留空间
批量局部更新:用 setCharAt 避免小范围逐字符构造
如果只是改几个连续或离散的单个字符(比如大小写转换、数字校验位填充),直接用 setCharAt(index, ch),它不涉及数组移动,比 delete+insert 快得多,且线程不安全但本意就用于单线程高频修改场景。
立即学习“Java免费学习笔记(深入)”;
- 适用于:密码掩码(如把中间4位变 *)、格式化手机号(加横杠)、ASCII 码修正等
- 注意:index 必须在当前长度范围内,否则抛
IndexOutOfBoundsException - 连续修改多个位置时,按索引升序调用
setCharAt即可,无需额外开销
避免隐式扩容:预设容量 + 复用实例
每次 append/delete/insert 都可能触发内部 char[] 扩容(通常是 1.5 倍增长),频繁局部更新时容易累积无效复制。解决方案是:
- 初始化时传入合理初始容量:
new StringBuilder(originalString.length() + expectedGrowth) - 多次局部更新尽量复用同一个 StringBuilder 实例,不要每次 new
- 用
sb.setLength(0)清空内容并重用,比新建对象更快(保留原有数组)


















