1. 方法定义

// 删除指定区间字符 [start, end)
public StringBuffer delete(int start, int end)

// 删除指定索引的单个字符
public StringBuffer deleteCharAt(int index)

2. 功能说明

方法 作用 返回值
delete(start, end) 删除索引 [start, end) 区间的字符 修改后的StringBuffer对象(支持链式调用)
deleteCharAt(index) 删除指定索引 index 处的单个字符 同上

3. 示例代码

StringBuffer sb = new StringBuffer("JavaScript");

// 删除索引[4,10) → "Java"
sb.delete(4, 10);  

// 删除索引2的字符 → "Jva"
sb.deleteCharAt(2);  

// 链式调用:删除首尾字符 → "v"
sb.deleteCharAt(0).deleteCharAt(sb.length()-1);

4. 使用技巧

  1. 区间快速操作
    // 删除前3字符:sb.delete(0, 3);
    // 删除后3字符:sb.delete(sb.length()-3, sb.length());
    
  2. 清空缓冲区
    sb.delete(0, sb.length());  // 比 new StringBuffer() 更省内存(复用对象)
    
  3. 动态删除匹配内容
    while (sb.indexOf("bug") != -1) {
        int pos = sb.indexOf("bug");
        sb.delete(pos, pos + 3);  // 删除所有"bug"
    }
    

5. 常见错误

  1. 索引越界
    StringBuffer sb = new StringBuffer("Hi");
    sb.delete(1, 5);   // StringIndexOutOfBoundsException
    sb.deleteCharAt(2); // StringIndexOutOfBoundsException
    
  2. 区间逻辑混淆
    // 错误:start > end 引发异常
    sb.delete(3, 1);   // StringIndexOutOfBoundsException
    
  3. 忽略返回值
    // 错误:未接收修改后的对象
    sb.delete(0, 1);  // 操作有效但未赋值
    System.out.println(sb); // 输出修改后结果
    

6. 注意事项

  1. 索引范围
    • start 必须满足 0 ≤ start ≤ end ≤ length()
    • deleteCharAt(index) 要求 0 ≤ index < length()
  2. 线程安全
    多线程环境下操作同一StringBuffer时,需注意同步:
    synchronized(sb) {
        sb.delete(0, 1);
    }
    
  3. 性能陷阱
    频繁删除开头字符效率低(需移动后续所有字符):
    // 低效:删除开头字符100次 → O(n²)
    for (int i = 0; i < 100; i++) {
        sb.deleteCharAt(0);  // 每次删除后需移动剩余字符
    }
    

7. 最佳实践与性能优化

  1. 批量删除替代单字符删除
    // ✅ 高效:一次性删除前100字符 → O(1)
    sb.delete(0, 100);
    
  2. 倒序删除避免数据移动
    // 删除特定字符(倒序避免索引变动)
    for (int i = sb.length()-1; i >= 0; i--) {
        if (sb.charAt(i) == 'a') sb.deleteCharAt(i);
    }
    
  3. 结合setLength()快速截断
    // 等效于 sb.delete(5, sb.length())
    sb.setLength(5);  // 更简洁高效
    
  4. 单线程场景优先用StringBuilder
    StringBuilder builder = new StringBuilder();
    builder.delete(0, 1);  // 相同API,无同步开销(性能提升15%+)
    

总结

关键点 操作建议
方法选择 批量删除 → delete(), 单点删除 → deleteCharAt()
性能优化 避免循环删除开头字符,优先批量删除或倒序删除
索引安全 始终校验:start ≥ 0, end ≤ length(), start ≤ end
线程环境 多线程用StringBuffer+同步块;单线程用StringBuilder
内存优化 delete(0, length())setLength(0) 清空缓冲区(复用对象)