Có, vì đó không phải là cách bạn xóa một dải ô khỏi mã bên ngoài. Thay vào đó, hãy làm điều này:
list.subList(start, end).clear();
Điều này thực sự gọi removeRange
là hậu trường. †
OP hỏi tại sao removeRange
không phải là một phần của List
API công khai. Lý do được mô tả trong Mục 40 của Hiệu quả Java phiên bản thứ 2 và tôi trích dẫn nó ở đây:
Có ba kỹ thuật để rút ngắn danh sách tham số quá dài. Một là chia phương thức thành nhiều phương thức, mỗi phương thức chỉ yêu cầu một tập hợp con của các tham số. Nếu thực hiện bất cẩn, điều này có thể dẫn đến quá nhiều phương pháp, nhưng nó cũng có thể giúp giảm số lượng phương pháp bằng cách tăng tính trực giao. Ví dụ, hãy xem xét java.util.List
giao diện. Nó không cung cấp các phương thức để tìm chỉ mục đầu tiên hoặc chỉ mục cuối cùng của một phần tử trong danh sách con, cả hai đều yêu cầu ba tham số. Thay vào đó, nó cung cấp subList
phương thức, phương thức này nhận hai tham số và trả về một dạng xem của danh sách con. Phương thức này có thể được kết hợp với indexOf
hoặc lastIndexOf
các phương thức, mỗi phương thức có một tham số duy nhất, để mang lại chức năng mong muốn. Hơn nữa,subList
phương thức có thể được kết hợp với bất kỳ phương thức nào hoạt động trên một List
cá thể để thực hiện các phép tính tùy ý trên danh sách con. API kết quả có tỷ lệ công suất trên trọng lượng rất cao.
Người ta có thể tranh luận rằng removeRange
không có nhiều tham số như vậy và do đó có lẽ không phải là ứng cử viên cho cách xử lý này, nhưng vì có một cách để gọi removeRange
thông qua subList
, không có lý do gì để làm lộn xộn List
giao diện với một phương thức thừa.
† Các AbstractList.removeRange
tài liệu cho biết:
Phương thức này được gọi bởi clear
thao tác trên danh sách này và các Danh sách con của nó. Ghi đè phương pháp này để tận dụng lợi thế bên trong của việc triển khai danh sách có thể cải thiện đáng kể hiệu suất của clear
hoạt động trên danh sách này và các Danh sách con của nó.
Ngoài ra, hãy xem việc triển khai OpenJDK của AbstractList.clear
và SubList.removeRange
.