Sự khác biệt chính xác giữa hai giao diện này là gì? Có Enumeration
lợi ích khi sử dụng Iterator
không? Nếu ai đó có thể giải thích, một bài báo tham khảo sẽ được đánh giá cao.
Sự khác biệt chính xác giữa hai giao diện này là gì? Có Enumeration
lợi ích khi sử dụng Iterator
không? Nếu ai đó có thể giải thích, một bài báo tham khảo sẽ được đánh giá cao.
Câu trả lời:
Nhìn vào Đặc tả API Java cho Iterator
giao diện, có một lời giải thích về sự khác biệt giữa Enumeration
:
Trình lặp khác với liệt kê theo hai cách:
- Các trình lặp cho phép người gọi loại bỏ các phần tử khỏi tập hợp cơ bản trong quá trình lặp với ngữ nghĩa được xác định rõ ràng.
- Tên phương pháp đã được cải thiện.
Điểm mấu chốt là, cả hai Enumeration
và Iterator
sẽ cung cấp các phần tử kế tiếp nhau, nhưng Iterator
được cải tiến theo cách như vậy để tên phương thức ngắn hơn và có một remove
phương thức bổ sung . Đây là một so sánh song song:
Enumeration Iterator
---------------- ----------------
hasMoreElement() hasNext()
nextElement() next()
N/A remove()
Như đã đề cập trong Thông số kỹ thuật API của Java, đối với các chương trình mới hơn, Iterator
nên được ưu tiên hơn Enumeration
, vì "Iterator thay thế cho Enumeration trong khuôn khổ bộ sưu tập Java." (Từ các Iterator
thông số kỹ thuật.)
Trình lặp lại không nhanh . tức là khi một luồng thay đổi bộ sưu tập bằng các thao tác thêm / bớt, trong khi một luồng khác đang duyệt nó thông qua một hasNext() or next()
phương thức sử dụng Iterator , trình vòng lặp sẽ bị lỗi nhanh chóng bằng cách ném ConcurrentModificationException
. Hành vi không nhanh của trình vòng lặp chỉ có thể được sử dụng để phát hiện lỗi. Các Enumerations được trả về bởi các phương thức của các lớp như Hashtable, Vector không nhanh không đạt được bằng cách đồng bộ hóa khối mã bên trong nextElement()
phương thức khóa đối tượng Vector hiện tại, tốn rất nhiều thời gian.
"Về mặt chính thức", chúng được cho là tương tự với giao diện trình lặp hỗ trợ các hoạt động bổ sung (ví dụ: loại bỏ). Nói chung, xu hướng là sử dụng các trình vòng lặp.
Đây là từ giao diện liệt kê javadocs :
LƯU Ý: Chức năng của giao diện này được sao chép bởi giao diện Iterator. Ngoài ra, Iterator thêm một thao tác loại bỏ tùy chọn và có tên phương thức ngắn hơn. Các triển khai mới nên xem xét sử dụng Iterator thay vì Enumeration.
Một thực tế đơn giản nhưng chưa được đề cập trong các câu trả lời trước đó là nó Iterator<T>
được sử dụng với Iterable<T>
để phục vụ trong for(_type_ element:collection){...}
cấu trúc diễn giải .
Có ba điểm khác biệt cơ bản trong Enumeration và Iterator
Enumeration
1. nó chỉ được sử dụng cho lớp trễ (ví dụ. Vector
)
Enumeration e = v.elements();
v is the object of `Vector` class
2. Đọc hoạt động có thể được thực hiện, chúng tôi không thể loại bỏ phần tử.
3. Hai phương pháp có sẵn
Trình lặp lại
nó có thể áp dụng cho tất cả Bộ sưu tập
Iterator itr = c.iterator();
where c is any `Collection` class
Thao tác Đọc và Xóa có thể được thực hiện
Ba phương pháp có sẵn
Giới hạn ở cả hai
Add object
vàReplace object
Nếu bạn đang viết lớp bộ sưu tập của riêng mình và bạn đang mở rộng bất kỳ lớp nào trong số các lớp hiện có hoặc triển khai bất kỳ giao diện khung của Bộ sưu tập nào, về cơ bản bạn không có lựa chọn nào khác ngoài việc sử dụng Iterator.
Nếu vì lý do nào đó (mà tôi không thể nghĩ ra) bạn đang tạo một lớp bộ sưu tập tùy chỉnh không liên quan đến java.util.Collection hoặc java.util.Map theo bất kỳ cách nào, bạn vẫn nên triển khai Iterable để mọi người có thể sử dụng lớp của bạn trong vòng lặp for.
Sự khác biệt chính là Enumeration không hiển thị phương thức remove (). Hơn nữa, Iterator không cho phép điều hướng và sửa đổi đồng thời trên một đối tượng cơ bản. Họ có quyền kiểm soát để xem liệu có các sửa đổi đồng thời hay tương tự hay không, và do đó cần xử lý nhiều hơn. Vì vậy, hiệu suất của Enumeration hầu như nhanh hơn 50% so với Iterator. Nếu chúng ta chỉ cần điều hướng bỏ qua đồng bộ hóa như vậy, chỉ cần sử dụng Enumeration.
1) Sự khác biệt chính giữa Iterator và Enumeration là loại bỏ phần tử trong khi duyệt qua bộ sưu tập. Iterator có thể loại bỏ phần tử trong quá trình duyệt bộ sưu tập vì nó có phương thức remove (). Phép liệt kê không có phương thức remove ().
2) Việc liệt kê về bản chất là không an toàn. Nó không ném ConcurrentModificationException nếu Bộ sưu tập được sửa đổi trong quá trình truyền tải. Về bản chất, Iterator không nhanh. Nó ném ConcurrentModificationException nếu một Bộ sưu tập được sửa đổi trong khi lặp khác với phương thức remove () của chính nó.
3) Enumeration là một giao diện kế thừa được sử dụng để duyệt qua Vector, Hashtable. Iterator không phải là một giao diện kế thừa. Lặp lại có thể được sử dụng để duyệt qua HashMap, LinkedList, ArrayList, HashSet, TreeMap, TreeSet.
Cả trình lặp và liệt kê đều được sử dụng để truy xuất dữ liệu, sự khác biệt là phép liệt kê chỉ có thể được sử dụng cho các lớp kế thừa tức là vectơ / ngăn xếp trong khi các trình vòng lặp có thể được sử dụng cho phần còn lại. Phép liệt kê cũng có thể được sử dụng cho bộ khóa trong bản đồ.