Theo như tôi có thể nói, lý do có thể được tìm thấy trong phần javadoc mà bạn không trích dẫn (nhấn mạnh bên dưới của tôi):
Trình lặp cho các danh sách cho phép lập trình viên duyệt qua danh sách theo một trong hai hướng, sửa đổi danh sách trong khi lặp ...
Bạn thấy, mục đích dự định là cho phép sử dụng trong khi danh sách đang được sửa đổi. Sửa đổi có thể rõ ràng bao gồm loại bỏ các yếu tố.
Bây giờ hãy nghĩ về những gì sẽ xảy ra nếu chúng ta loại bỏ một phần tử sẽ current()
dành cho iterator - giả sử rằng iterator sẽ có một khái niệm về phần tử hiện tại? Trong bối cảnh này, cách để thực hiện nó mà không có khái niệm về yếu tố hiện tại có ý nghĩa khá tốt đối với tôi - bởi vì theo cách đó, iterator không phải lo lắng về việc loại bỏ các yếu tố.
Điều quan trọng cần lưu ý là javadoc không yêu cầu triển khai giao diện phải an toàn cho luồng.
- Do đó, người ta không nên mong đợi xử lý chính xác các sửa đổi được thực hiện từ các luồng khác nhau - vì điều đó, việc triển khai sẽ phải cung cấp các phương tiện bổ sung để đồng bộ hóa quyền truy cập, đảm bảo khả năng hiển thị, v.v. như được chỉ định bởi Mô hình bộ nhớ Java trên mỗi JSR 133 .
Những gì ListIterator có khả năng, là xử lý các sửa đổi được thực hiện từ cùng một luồng khi lặp. Không phải tất cả các trình vòng lặp đều như vậy, javadocs đồng thời đặc biệt cảnh báo về điều này:
... Lưu ý rằng ngoại lệ này không phải lúc nào cũng chỉ ra rằng một đối tượng đã được sửa đổi đồng thời bởi một luồng khác. Nếu một luồng duy nhất đưa ra một chuỗi các yêu cầu phương thức vi phạm hợp đồng của một đối tượng, thì đối tượng đó có thể ném ngoại lệ này. Ví dụ: nếu một luồng sửa đổi trực tiếp một bộ sưu tập trong khi nó đang lặp qua bộ sưu tập với một trình vòng lặp không nhanh, thì trình vòng lặp sẽ ném ngoại lệ này ...