StringBuilder.delete() 是 Java 中高效操作字符串的核心方法,用于删除字符串序列中的指定子序列。直接修改原对象,避免创建新对象,适合高性能场景。


1. 方法定义

public StringBuilder delete(int start, int end)
  • 参数
    • start:起始索引(包含),范围 [0, length()]
    • end:结束索引(不包含),范围 [start, length()]
  • 返回值:当前 StringBuilder 对象(支持链式调用)
  • 异常:若索引越界抛出 StringIndexOutOfBoundsException

2. 功能说明

  • 删除从 startend-1 的字符。
  • 删除后字符串长度减少 (end - start)
  • 操作原理:底层数组移动元素覆盖删除区间,不创建新对象。

3. 示例代码

public class DeleteExample {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder("Hello, World!");
        
        // 删除索引 7 到 12("World")
        sb.delete(7, 12);
        System.out.println(sb); // 输出: "Hello, !"
        
        // 链式调用:删除前5个字符,再删除后2个字符
        sb.delete(0, 5).delete(sb.length() - 2, sb.length());
        System.out.println(sb); // 输出: ","
    }
}

4. 使用技巧

  1. 高效删除首尾字符
    sb.delete(0, 1);      // 删除第一个字符
    sb.delete(sb.length() - 1, sb.length()); // 删除最后一个字符
    
  2. 清空 StringBuilder
    sb.delete(0, sb.length()); // 等效于 sb.setLength(0)
    
  3. 结合索引方法动态定位
    int index = sb.indexOf("Error");
    if (index != -1) {
        sb.delete(index, index + 5); // 删除"Error"
    }
    

5. 常见错误与注意事项

  1. 索引越界

    // 错误示例:start > end 或 end > length()
    StringBuilder sb = new StringBuilder("Java");
    sb.delete(2, 10); // 抛出 StringIndexOutOfBoundsException
    

    解决:始终校验索引范围:

    int start = 2, end = 10;
    end = Math.min(end, sb.length()); // 限制end不超过长度
    if (start <= end) sb.delete(start, end);
    
  2. 误用 deleteCharAt()

    • delete() 删除区间,deleteCharAt() 删除单个字符:
      sb.deleteCharAt(3);   // 正确:删除索引3的单个字符
      sb.delete(3, 4);      // 等效写法
      
  3. 线程安全问题

    • StringBuilder 非线程安全!多线程环境需改用 StringBuffer

6. 最佳实践与性能优化

  1. 批量删除优于单字符删除

    // ✅ 高效:一次删除区间
    sb.delete(start, end);
    
    // ❌ 低效:循环删除单字符(多次移动数组)
    for (int i = start; i < end; i++) {
        sb.deleteCharAt(start); // 每次删除后索引变化,易出错
    }
    
  2. 避免频繁扩容

    • 预估最终大小,初始化时设置容量:
      StringBuilder sb = new StringBuilder(100); // 初始容量100
      
  3. 复用 StringBuilder 对象

    • 清空并复用对象,减少 GC 压力:
      sb.delete(0, sb.length()); // 清空内容,保留底层数组
      

7. 总结

关键点 说明
核心作用 高效删除字符串指定区间,直接修改原对象
性能优势 内存操作(数组移动),无新对象创建
正确使用索引 start ∈ [0, length], end ∈ [start, length]
线程安全 非线程安全 → 多线程用 StringBuffer
性能关键 批量删除 > 单字符删除;预设容量避免扩容