方法定义

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

使用技巧

  1. 逆序删除避免索引错位

    // 错误示例:删除多个连续字符时索引会变化
    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"
    
  2. 结合 indexOf() 动态删除

    StringBuilder sb = new StringBuilder("Mississippi");
    int index = sb.indexOf("i");
    while (index != -1) {
        sb.deleteCharAt(index);
        index = sb.indexOf("i", index); // 从当前位置继续查找
    }
    // 删除所有 'i'
    
  3. 删除特定条件字符(如非字母)

    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
    

常见错误

  1. 索引越界

    StringBuilder sb = new StringBuilder("A");
    sb.deleteCharAt(1); // 抛出 IndexOutOfBoundsException
    sb.deleteCharAt(-1); // 同样抛出异常
    
  2. 删除时索引未更新导致逻辑错误

    StringBuilder sb = new StringBuilder("abc");
    for (int i = 0; i < sb.length(); i++) {
        if (sb.charAt(i) == 'b') {
            sb.deleteCharAt(i);
            // i 不应递增,否则跳过下一个字符
        }
    }
    // 正确做法:删除后 i-- 或使用逆序遍历
    
  3. 空 StringBuilder 删除

    StringBuilder sb = new StringBuilder();
    sb.deleteCharAt(0); // 抛出异常:String index out of range: 0
    

注意事项

  • 原地修改deleteCharAt() 直接修改原对象,不会返回新对象。
  • ⚠️ 索引范围:有效索引为 0length() - 1
  • ⚠️ 线程不安全StringBuilder 不是线程安全的,多线程环境下应使用 StringBuffer
  • 链式调用:方法返回 this,支持连续操作。

最佳实践与性能优化

  1. 优先使用 StringBuilder 而非 String 拼接/删除

    // 低效
    String str = "abc";
    str = str.substring(0, 1) + str.substring(2); // 创建新字符串对象
    
    // 高效
    StringBuilder sb = new StringBuilder("abc");
    sb.deleteCharAt(1); // 原地操作,无对象创建开销
    
  2. 批量删除时考虑 delete() 方法

    // 删除多个连续字符,使用 delete() 更高效
    sb.delete(2, 5); // 删除索引2到4的字符
    // 比连续调用 deleteCharAt() 更快
    
  3. 预估容量减少扩容开销

    StringBuilder sb = new StringBuilder(100); // 预设容量
    // 避免频繁扩容,提升性能
    
  4. 避免在 for 循环中频繁删除(正序): 如上所述,应使用逆序遍历或收集索引后统一处理。


总结

项目 说明
核心功能 删除指定索引的单个字符
适用场景 动态字符串修改、字符过滤、格式清理
性能优势 原地修改,避免创建新对象,高效
关键技巧 逆序删除、链式调用、结合 indexOf
常见陷阱 索引越界、删除后索引错位
替代方案 多字符删除用 delete(start, end)

快速掌握要点

  1. 记住方法签名:deleteCharAt(int index)
  2. 索引从0开始,不能越界
  3. 支持链式调用
  4. 删除多个字符时用逆序遍历
  5. String 操作高效得多

掌握 deleteCharAt() 是高效处理字符串动态修改的关键技能,尤其在解析、清洗、格式化文本时非常实用。结合 StringBuilder 的其他方法,可实现高性能的字符串操作。