方法定义
public StringBuilder deleteCharAt(int index)
- 返回类型:
StringBuilder
(返回调用对象本身,支持链式调用) - 参数:
index
:要删除的字符的索引(从0开始)
- 异常:
IndexOutOfBoundsException
:如果index
小于0或大于等于当前字符串长度(length()
)
功能说明
deleteCharAt()
方法用于删除指定索引位置的单个字符,并自动将后续字符向前移动以填补空缺。该方法直接修改原 StringBuilder
对象,不创建新对象。
示例代码
基本使用
StringBuilder sb = new StringBuilder("Hello World");
sb.deleteCharAt(5); // 删除索引5处的空格
System.out.println(sb); // 输出: HelloWorld
链式调用
StringBuilder sb = new StringBuilder("abc123");
sb.deleteCharAt(3).deleteCharAt(3).deleteCharAt(3);
System.out.println(sb); // 输出: abc
// 连续删除3个字符(索引3处的'1','2','3')
删除首尾字符
StringBuilder sb = new StringBuilder("Java");
sb.deleteCharAt(0); // 删除首字符 'J'
sb.deleteCharAt(sb.length() - 1); // 删除末尾字符 'a'
System.out.println(sb); // 输出: av
使用技巧
逆序删除避免索引错位:
// 错误示例:删除多个连续字符时索引会变化 StringBuilder sb = new StringBuilder("abcdef"); for (int i = 1; i <= 3; i++) { sb.deleteCharAt(i); // 会跳过某些字符 } // 正确做法:从后往前删 for (int i = 3; i >= 1; i--) { sb.deleteCharAt(i); } // 结果: "af"
结合
indexOf()
动态删除:StringBuilder sb = new StringBuilder("Mississippi"); int index = sb.indexOf("i"); while (index != -1) { sb.deleteCharAt(index); index = sb.indexOf("i", index); // 从当前位置继续查找 } // 删除所有 'i'
删除特定条件字符(如非字母):
StringBuilder sb = new StringBuilder("He1l2lo!@#"); for (int i = sb.length() - 1; i >= 0; i--) { if (!Character.isLetter(sb.charAt(i))) { sb.deleteCharAt(i); } } System.out.println(sb); // 输出: Hello
常见错误
索引越界:
StringBuilder sb = new StringBuilder("A"); sb.deleteCharAt(1); // 抛出 IndexOutOfBoundsException sb.deleteCharAt(-1); // 同样抛出异常
删除时索引未更新导致逻辑错误:
StringBuilder sb = new StringBuilder("abc"); for (int i = 0; i < sb.length(); i++) { if (sb.charAt(i) == 'b') { sb.deleteCharAt(i); // i 不应递增,否则跳过下一个字符 } } // 正确做法:删除后 i-- 或使用逆序遍历
空 StringBuilder 删除:
StringBuilder sb = new StringBuilder(); sb.deleteCharAt(0); // 抛出异常:String index out of range: 0
注意事项
- ✅ 原地修改:
deleteCharAt()
直接修改原对象,不会返回新对象。 - ⚠️ 索引范围:有效索引为
0
到length() - 1
。 - ⚠️ 线程不安全:
StringBuilder
不是线程安全的,多线程环境下应使用StringBuffer
。 - ✅ 链式调用:方法返回
this
,支持连续操作。
最佳实践与性能优化
优先使用
StringBuilder
而非String
拼接/删除:// 低效 String str = "abc"; str = str.substring(0, 1) + str.substring(2); // 创建新字符串对象 // 高效 StringBuilder sb = new StringBuilder("abc"); sb.deleteCharAt(1); // 原地操作,无对象创建开销
批量删除时考虑
delete()
方法:// 删除多个连续字符,使用 delete() 更高效 sb.delete(2, 5); // 删除索引2到4的字符 // 比连续调用 deleteCharAt() 更快
预估容量减少扩容开销:
StringBuilder sb = new StringBuilder(100); // 预设容量 // 避免频繁扩容,提升性能
避免在
for
循环中频繁删除(正序): 如上所述,应使用逆序遍历或收集索引后统一处理。
总结
项目 | 说明 |
---|---|
核心功能 | 删除指定索引的单个字符 |
适用场景 | 动态字符串修改、字符过滤、格式清理 |
性能优势 | 原地修改,避免创建新对象,高效 |
关键技巧 | 逆序删除、链式调用、结合 indexOf |
常见陷阱 | 索引越界、删除后索引错位 |
替代方案 | 多字符删除用 delete(start, end) |
✅ 快速掌握要点:
- 记住方法签名:
deleteCharAt(int index)
- 索引从0开始,不能越界
- 支持链式调用
- 删除多个字符时用逆序遍历
- 比
String
操作高效得多
掌握 deleteCharAt()
是高效处理字符串动态修改的关键技能,尤其在解析、清洗、格式化文本时非常实用。结合 StringBuilder
的其他方法,可实现高性能的字符串操作。