StringBuilder删除操作有delete(start,end)和deleteCharAt(index)两个方法,均直接修改原对象、索引左闭右开;前者删范围,后者删单字符;需注意索引越界、长度动态变化及与replace()的语义差异。

Java中StringBuilder的删除操作主要有两个方法:delete(int start, int end)和deleteCharAt(int index)。它们不返回新对象,而是直接修改原StringBuilder实例,且索引均从0开始、左闭右开(end不包含)。
delete(start, end):按范围删除子串
该方法删除从start(含)到end(不含)之间的所有字符。若start == end,则不删除任何内容;若start > end或任一索引越界( 或 <code>> length()),会抛出StringIndexOutOfBoundsException。
- 删除前5个字符:
sb.delete(0, 5) - 删除最后3个字符:
sb.delete(sb.length() - 3, sb.length()) - 清空全部内容:
sb.delete(0, sb.length())(等价于sb.setLength(0))
deleteCharAt(index):按位置删除单个字符
该方法仅删除指定索引处的一个字符。它本质是delete(index, index + 1)的简写,因此同样要求0 ≤ index ,否则抛异常。
- 删掉第一个字符:
sb.deleteCharAt(0) - 删掉倒数第二个字符:
sb.deleteCharAt(sb.length() - 2) - 循环删除所有偶数位字符(需倒序遍历,避免索引偏移):
for (int i = sb.length() - 1; i >= 0; i -= 2) { sb.deleteCharAt(i); }
常见陷阱与注意事项
这两个方法都会改变原对象长度,后续操作需注意索引动态变化。例如连续调用deleteCharAt(0)两次,第二次实际删的是原字符串的第二个字符。
立即学习“Java免费学习笔记(深入)”;
- 删除后立即读取长度:
int len = sb.length(),不要复用旧值 - 在循环中删除时,优先考虑倒序遍历或使用迭代器逻辑(
StringBuilder无内置迭代器,需手动控制) - 若需保留原串,应先调用
new StringBuilder(original)创建副本再操作 -
delete(0, 0)和deleteCharAt在索引为0时行为不同:前者无影响,后者会删首字符
对比 replace() 与 delete() 的适用场景
replace(start, end, str)用新字符串替换某段,而delete()是彻底移除。当目标是“清空某段并留空”时,delete()更高效直观;若需替换成特定内容(如星号遮盖),则用replace()更自然。
- 隐藏手机号中间4位:
sb.replace(3, 7, "****") - 仅去掉中间4位(不留空):
sb.delete(3, 7) - 两者都可实现,但语义和性能略有差异——
delete()少一次内存复制


















