StringBuilder.delete()
是 Java 中高效操作字符串的核心方法,用于删除字符串序列中的指定子序列。直接修改原对象,避免创建新对象,适合高性能场景。
1. 方法定义
public StringBuilder delete(int start, int end)
- 参数:
start
:起始索引(包含),范围[0, length()]
end
:结束索引(不包含),范围[start, length()]
- 返回值:当前
StringBuilder
对象(支持链式调用) - 异常:若索引越界抛出
StringIndexOutOfBoundsException
2. 功能说明
- 删除从
start
到end-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. 使用技巧
- 高效删除首尾字符:
sb.delete(0, 1); // 删除第一个字符 sb.delete(sb.length() - 1, sb.length()); // 删除最后一个字符
- 清空 StringBuilder:
sb.delete(0, sb.length()); // 等效于 sb.setLength(0)
- 结合索引方法动态定位:
int index = sb.indexOf("Error"); if (index != -1) { sb.delete(index, index + 5); // 删除"Error" }
5. 常见错误与注意事项
索引越界:
// 错误示例: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);
误用
deleteCharAt()
:delete()
删除区间,deleteCharAt()
删除单个字符:sb.deleteCharAt(3); // 正确:删除索引3的单个字符 sb.delete(3, 4); // 等效写法
线程安全问题:
StringBuilder
非线程安全!多线程环境需改用StringBuffer
。
6. 最佳实践与性能优化
批量删除优于单字符删除:
// ✅ 高效:一次删除区间 sb.delete(start, end); // ❌ 低效:循环删除单字符(多次移动数组) for (int i = start; i < end; i++) { sb.deleteCharAt(start); // 每次删除后索引变化,易出错 }
避免频繁扩容:
- 预估最终大小,初始化时设置容量:
StringBuilder sb = new StringBuilder(100); // 初始容量100
- 预估最终大小,初始化时设置容量:
复用 StringBuilder 对象:
- 清空并复用对象,减少 GC 压力:
sb.delete(0, sb.length()); // 清空内容,保留底层数组
- 清空并复用对象,减少 GC 压力:
7. 总结
关键点 | 说明 |
---|---|
核心作用 | 高效删除字符串指定区间,直接修改原对象 |
性能优势 | 内存操作(数组移动),无新对象创建 |
正确使用索引 | start ∈ [0, length] , end ∈ [start, length] |
线程安全 | 非线程安全 → 多线程用 StringBuffer |
性能关键 | 批量删除 > 单字符删除;预设容量避免扩容 |