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. 使用技巧
- 区间快速操作
// 删除前3字符:sb.delete(0, 3);
// 删除后3字符:sb.delete(sb.length()-3, sb.length());
- 清空缓冲区
sb.delete(0, sb.length()); // 比 new StringBuffer() 更省内存(复用对象)
- 动态删除匹配内容
while (sb.indexOf("bug") != -1) {
int pos = sb.indexOf("bug");
sb.delete(pos, pos + 3); // 删除所有"bug"
}
5. 常见错误
- 索引越界
StringBuffer sb = new StringBuffer("Hi");
sb.delete(1, 5); // StringIndexOutOfBoundsException
sb.deleteCharAt(2); // StringIndexOutOfBoundsException
- 区间逻辑混淆
// 错误:start > end 引发异常
sb.delete(3, 1); // StringIndexOutOfBoundsException
- 忽略返回值
// 错误:未接收修改后的对象
sb.delete(0, 1); // 操作有效但未赋值
System.out.println(sb); // 输出修改后结果
6. 注意事项
- 索引范围
start
必须满足 0 ≤ start ≤ end ≤ length()
deleteCharAt(index)
要求 0 ≤ index < length()
- 线程安全
多线程环境下操作同一StringBuffer时,需注意同步:
synchronized(sb) {
sb.delete(0, 1);
}
- 性能陷阱
频繁删除开头字符效率低(需移动后续所有字符):
// 低效:删除开头字符100次 → O(n²)
for (int i = 0; i < 100; i++) {
sb.deleteCharAt(0); // 每次删除后需移动剩余字符
}
7. 最佳实践与性能优化
- 批量删除替代单字符删除
// ✅ 高效:一次性删除前100字符 → O(1)
sb.delete(0, 100);
- 倒序删除避免数据移动
// 删除特定字符(倒序避免索引变动)
for (int i = sb.length()-1; i >= 0; i--) {
if (sb.charAt(i) == 'a') sb.deleteCharAt(i);
}
- 结合
setLength()
快速截断
// 等效于 sb.delete(5, sb.length())
sb.setLength(5); // 更简洁高效
- 单线程场景优先用
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) 清空缓冲区(复用对象) |