deleteCharAt 是 StringBuilder 中高效删除指定索引处单个字符的方法,时间复杂度 O(n),需先确认索引有效性(0 ≤ index < length)。

deleteCharAt 是 StringBuilder 中专门用于删除指定索引处单个字符的高效方法,时间复杂度为 O(n),因为后续字符需整体左移一位,但无需新建对象或遍历查找,比 replace、substring 拼接等方式更直接、更省内存。
确认索引有效性再调用
deleteCharAt 要求索引在 0 ≤ index 范围内,越界会抛出 StringIndexOutOfBoundsException。实际使用中建议先校验:
- 用
if (index >= 0 && index 包裹调用 - 若 index 来自用户输入或计算结果(如查找某个字符首次出现位置),务必检查
sb.indexOf("x")是否返回 -1 - 例如:想删掉第一个 'a',应写
int i = sb.indexOf("a"); if (i != -1) sb.deleteCharAt(i);
注意索引是“删除前”的位置
StringBuilder 的索引始终基于当前字符串状态。如果连续删除多个字符,后续索引需按已删字符动态调整:
- 比如
sb = new StringBuilder("hello"),sb.deleteCharAt(1)删掉 'e',变成 "hllo" - 此时再删原位置 2(即现在的 'l')不能写
sb.deleteCharAt(2)—— 因为原索引 2 对应的是 'l',但删完第一个后,原索引 2 变成了新字符串中索引 1 的位置 - 如需批量删多个固定位置,建议从后往前删(避免索引偏移),或先收集所有待删索引再排序逆序处理
替代方案对比:什么情况不该用 deleteCharAt
它适合精准定位单个位置的删除,但不适用于以下场景:
立即学习“Java免费学习笔记(深入)”;
- 删除满足条件的所有字符(如所有空格)→ 改用
sb.replace(...)或遍历 + deleteCharAt(注意索引变化) - 删除子串而非单字符 → 直接用
sb.delete(start, end)更合适 - 仅需“跳过”某个字符参与后续构建(如过滤逻辑)→ 考虑用 for 循环 append 非目标字符,避免频繁移动内存
性能小贴士
单次 deleteCharAt 开销可控,但在循环中高频调用(如每轮删一个)会导致多次数组复制,影响性能:
- 1000 次 deleteCharAt 在长度为 10000 的 StringBuilder 上,最坏情况约移动 500 万字符
- 若需大量条件删除,优先用
char[] chars = sb.toString().toCharArray()扫描标记,再一次性构造新 StringBuilder - 必要时可配合
sb.setLength(0)清空后重新 append 有效字符,比反复 delete 更快


















