2009-06-04 50 views
102

Sự khác biệt chính xác giữa hai giao diện này là gì? Enumeration có các lợi ích khi sử dụng Iterator không? Nếu bất cứ ai có thể xây dựng, một bài viết tham khảo sẽ được đánh giá cao.Sự khác biệt giữa Java Enumeration và Iterator

+3

Tôi đã sử dụng tìm kiếm trên google và kết quả đầu tiên là một cuộc thảo luận thú vị trong JavaRanch về [Enumeration vs Iterator] (http://www.coderanch.com/t/202139/Performance/java/Enumeration-vs-Iterator) –

Trả lời

124

Nhìn vào Đặc điểm kỹ thuật Java API cho giao diện Iterator, có một giải thích về sự khác nhau giữa Enumeration:

vòng lặp khác nhau từ enumerations theo hai cách:

  • vòng lặp cho phép người gọi để xóa các phần tử khỏi bộ sưu tập cơ bản trong khi lặp lại với ngữ nghĩa được xác định rõ.
  • Tên phương pháp đã được cải thiện.

Điểm mấu chốt là, cả hai EnumerationIterator sẽ cung cấp cho các yếu tố liên tiếp, nhưng Iterator được cải thiện theo cách như vậy nên tên phương pháp là ngắn hơn, và có một phương pháp bổ sung remove. Đây là một side-by-side so sánh:

Enumeration      Iterator 
    ----------------    ---------------- 
    hasMoreElement()    hasNext() 
    nextElement()     next() 
    N/A        remove() 

Như cũng được đề cập trong API Thông số kỹ thuật Java, cho các chương trình mới hơn, Iterator nên được ưa thích hơn Enumeration, như "Iterator mất nơi liệt kê trong khuôn khổ bộ sưu tập Java . " (Từ thông số Iterator.)

+6

Tôi nghĩ rằng có một chút giải thích mất tích từ câu trả lời này liên quan đến đồng thời. –

+0

@Paul_Draper: Các chỉnh sửa không nên thêm ý nghĩa mới vào bài đăng, đó là ý kiến ​​dành cho. – Emil

+2

@coobird Bạn có chắc "Số đếm thường nhanh hơn" không? kể từ khi liệt kê có "đồng bộ hóa khối mã bên trong nextElement()" Và chúng tôi không có đồng bộ hóa tại Iterators gây ra ConcurrentModificationException rit ?? Chúng ta gọi là Iterator thường nhanh hơn và Enumerations là an toàn hơn một chút. ?? –

11

"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ụ: xóa). Nói chung, xu hướng là sử dụng trình vòng lặp.

Đây là từ the enumeration interface javadocs:

Chú ý: Chức năng của giao diện này được nhân đôi bởi giao diện Iterator. Ngoài ra, Iterator thêm tùy chọn xóa hoạt động và có phương thức ngắn hơn tên. Triển khai mới cần xem xét sử dụng Iterator theo sở thích để liệt kê.

2

Nếu bạn đang viết lớp sưu tập của riêng mình và bạn đang mở rộng bất kỳ lớp học hiện có hoặc triển khai bất kỳ giao diện khung 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 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 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 nên vẫn là thực hiện lặp lại để mọi người có thể sử dụng lớp của bạn cho các vòng lặp.

2

Sự khác biệt chính là Liệt kê không hiển thị phương thức remove(). Hơn nữa, Iterator không cho phép điều hướng đồng thời và sửa đổi trên một đối tượng bên dưới. Họ có một kiểm soát để xem nếu có những sửa đổi đồng thời hay như vậy, và do đó có nhiều chế biến. Vì vậy, hiệu suất của Enumeration nhanh hơn gần 50% so với Iterator. Nếu chúng ta chỉ cần điều hướng bỏ qua việc đồng bộ hóa như vậy, chỉ cần sử dụng Enumeration.

+0

Đúng là liệt kê không "không" vạch trần phương thức remove() - nhưng nó cũng không chú ý đến việc triệu gọi lệnh remove() api của Collection. Ví dụ sau mã sẽ chỉ in: AAA, CCC, EEE. ------------------------------------------------ ----- Vector v = new Vector (6); v.add ("AAA"); v.add ("BBB"); v.add ("CCC"); v.add ("DDD"); v.add ("EEE"); v.add ("FFF"); Điều tra số vi = v.elements(); while (en.hasMoreElements()) String value = (String) vi.nextElement(); System.out.println (giá trị); v.remove (giá trị); – javauser71

-1

Cả hai trình lặp và liệt kê được sử dụng để lấy dữ liệu, sự khác biệt là liệt kê chỉ có thể được sử dụng cho các lớp kế thừa tức là vector/stack trong khi vòng lặp có thể được sử dụng cho phần còn lại. Việc liệt kê cũng có thể được sử dụng cho tập hợp khóa trong bản đồ.

+0

Bạn nhìn thấy ở đâu mà bạn có thể sử dụng liệt kê cho các bộ bản đồ chính ?? – Kutzi

31

Iterators là không nhanh. tức là khi một luồng thay đổi bộ sưu tập bằng cách thêm/xóa các thao tác, trong khi một luồng khác đi qua nó bằng Iterator bằng cách sử dụng phương thức hasNext() or next(), trình lặp không nhanh bằng cách ném ConcurrentModificationException. Hành vi không nhanh của các trình vòng lặp có thể được sử dụng chỉ để 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 chóng đạt được bằng cách đồng bộ hóa khối mã bên trong phương thức nextElement() khóa đối tượng Vector hiện tại tốn rất nhiều thời gian.

+4

Chỉ một phần đúng: hành vi này không được xác định trong giao diện, nó phụ thuộc vào việc thực thi Iterator. Đúng là việc triển khai bộ sưu tập 'cũ' trong java.util (HashSet, ArrayList, v.v.) thể hiện hành vi này. Tuy nhiên, các bộ sưu tập 'đồng thời' mới hơn sẽ không bao giờ ném một ConcurrentModificationException, chúng sẽ đi qua bộ sưu tập kể từ thời điểm tạo trình lặp. Các triển khai khác có thể hiển thị các hành vi khác nhau. – Kutzi

+0

Cũng đáng chú ý: "Lưu ý rằng hành vi không nhanh có thể không được đảm bảo vì nói chung, không thể thực hiện bất kỳ đảm bảo cứng nào khi có sự sửa đổi đồng thời không đồng bộ. Do đó, nó sẽ là sai để viết một chương trình phụ thuộc vào ngoại lệ này cho tính chính xác của nó: ConcurrentModificationException chỉ nên được sử dụng để phát hiện lỗi. " http://docs.oracle.com/javase/7/docs/api/java/util/ConcurrentModificationException.html – Kutzi

6

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à Iterator<T> được sử dụng với Iterable<T> để phân phối cấu trúc for(_type_ element:collection){...}.

4

Có ba khác biệt cơ bản trong Enumeration và Iterator

Enumeration
1. nó là sử dụng cho chỉ lớp lagacy (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ể xóa phần tử.
3. Hai Phương thức có sẵn

  • công khai boolean hasNextElement();
  • đối tượng công cộng nextElement();

Iterator

  1. nó được áp dụng cho tất cả các Bộ sưu tập

    Iterator itr = c.iterator(); 
    where c is any `Collection` class 
    
  2. Đọc và Remove hoạt động có thể được thực hiện

  3. Ba phương pháp có sẵn

    • công khai boolean hasNext();
    • đối tượng công cộng tiếp theo();
    • void công cộng remove();

Limition trong cả

  • Move chỉ về phía trước hướng
  • Không có bất kỳ phương pháp cho Add objectReplace object
0

Enumeration có thể được sử dụng chỉ cho những di sản lớp (Vector, Ngăn xếp ...), trong khi Iterator có thể được sử dụng cho tất cả.

Các vấn đề liên quan