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 removeRangelà hậu trường. †
OP hỏi tại sao removeRangekhông phải là một phần của ListAPI 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.Listgiao 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 subListphươ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 indexOfhoặc lastIndexOfcá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,subListphươ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 Listcá 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 removeRangekhô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 removeRangethông qua subList, không có lý do gì để làm lộn xộn Listgiao diện với một phương thức thừa.
† Các AbstractList.removeRangetà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 clearhoạ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.clearvà SubList.removeRange.