在StringBuilder中高效删除字符应优先使用delete、replace或setLength等原生方法:delete(int start, int end)直接移除区间,时间复杂度O(n);replace(int start, int end, String str)传空字符串等效删除,语义更灵活;setLength(int newLength)截断末尾为O(1)操作;避免循环调用deleteCharAt导致多次数组复制。

在 StringBuilder 中高效删除字符,关键不是“删”,而是“避免删”——优先用 replace、delete 或 setLength 等原生方法,避免转成 String 再操作,也尽量避开低效的逐个字符遍历。
用 delete(int start, int end) 直接移除区间
这是最常用也最高效的方式。StringBuilder 的 delete 方法直接操作内部 char 数组,时间复杂度 O(n),其中 n 是后续需要移动的字符数(即从 end 开始到末尾的长度)。
- 删除第 3 个字符(索引为 2):sb.delete(2, 3)
- 删除开头 5 个字符:sb.delete(0, 5)
- 删除末尾 3 个字符:sb.delete(sb.length() - 3, sb.length())
用 replace(int start, int end, String str) 替换为“空”
本质和 delete 类似,但语义更灵活。replace 把指定区间替换成给定字符串,传入空字符串 "" 即等效于删除。
- 删除索引 1~4(含)之间的字符:sb.replace(1, 5, "")
- 相比 delete,replace 更适合“删掉一段再补点新内容”的场景,比如把 "abc123def" 中的数字替换成 "_":sb.replace(3, 6, "_") → "abc_def"
用 setLength(int newLength) 快速截断末尾
如果只需删掉末尾若干字符,setLength 是常数时间 O(1) 操作,因为它只改 length 字段,不移动任何字符。
立即学习“Java免费学习笔记(深入)”;
- 去掉最后 2 个字符:sb.setLength(sb.length() - 2)
- 清空全部:sb.setLength(0)
- 注意:setLength 缩短后,被截掉的字符仍保留在内部数组中(只是不可见),后续 append 会覆盖;如需彻底释放内存,可配合 new StringBuilder(sb.toString()),但通常没必要
避免低效写法:别用 for 循环删单个字符
反复调用 deleteCharAt(i) 或 replace(i, i+1, "") 在循环中删除多个位置,会导致多次数组复制,性能急剧下降。
- ❌ 错误示范(删除所有 'a'):for (int i = sb.length()-1; i >= 0; i--) if (sb.charAt(i) == 'a') sb.deleteCharAt(i); —— 每次 delete 都要移动后面所有字符
- ✅ 推荐做法:转为字符数组处理,或用反向构建(如新建 StringBuilder,遍历原串跳过目标字符)


















