簡體   English   中英

Java枚舉和迭代器的區別

[英]Difference between Java Enumeration and Iterator

這兩個接口之間的確切區別是什么? Enumeration比使用Iterator有好處嗎? 如果有人可以詳細說明,將不勝感激參考文章。

查看Iterator接口的 Java API 規范,有對Enumeration之間差異的解釋:

迭代器在兩個方面不同於枚舉:

  • 迭代器允許調用者在具有明確定義語義的迭代期間從底層集合中刪除元素。
  • 方法名稱已得到改進。

最重要的是, EnumerationIterator都會給出連續的元素,但Iterator通過縮短措辭改進了方法名稱,並且它有一個額外的remove方法。 這是一個並排的比較:

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

正如 Java API 規范中所提到的,對於較新的程序, Iterator應該優先於Enumeration ,因為“Iterator 取代了 Java 集合框架中的 Enumeration”。 (來自Iterator規范。)

迭代器是快速失敗的 即,當一個線程通過添加/刪除操作更改集合,而另一個線程使用hasNext() or next()方法通過 Iterator 遍歷它時,迭代器會通過拋出ConcurrentModificationException迅速失敗。 迭代器的快速失敗行為只能用於檢測錯誤。 由 Hashtable、Vector 等類的方法返回的枚舉不是快速失敗的,這是通過同步nextElement()方法內的代碼塊來實現的,該方法鎖定當前的 Vector 對象,這會花費大量時間。

“正式地”,它們應該類似於支持額外操作(例如,刪除)的迭代器接口。 通常,傾向於使用迭代器。

這是來自枚舉接口 javadocs

注意:此接口的功能由 Iterator 接口復制。 此外,Iterator 添加了一個可選的刪除操作,並具有較短的方法名稱。 新的實現應該考慮使用 Iterator 而不是 Enumeration。

一個簡單但在之前的答案中沒有提到的事實是Iterator<T>Iterable<T>一起用於解釋for(_type_ element:collection){...}結構。

枚舉和迭代器有基本的三個區別

枚舉
1. 它僅用於滯后類(例如Vector

    Enumeration e = v.elements();  
    v is the object of `Vector` class

2. 可以執行讀操作,不能刪除元素。
3. 兩種方法可用

  • 公共布爾 hasNextElement();
  • 公共對象 nextElement();

迭代器

  1. 它適用於所有收藏

    Iterator itr = c.iterator(); where c is any `Collection` class
  2. 可以執行讀取和刪除操作

  3. 三種方法可用

    • 公共布爾 hasNext();
    • 公共對象 next();
    • 公共無效刪除();

Limition兩個

  • 僅向前移動
  • Add objectReplace object沒有任何方法

1) Iterator 和 Enumeration 的主要區別在於遍歷集合時移除元素。 迭代器可以在遍歷集合期間移除元素,因為它具有 remove() 方法。 枚舉沒有 remove() 方法。

2) 枚舉本質上是故障安全的。 如果在遍歷過程中修改了 Collection,則不會拋出 ConcurrentModificationException。 迭代器本質上是快速失敗的。 如果在迭代它自己的 remove() 方法以外的時候修改了一個集合,它會拋出 ConcurrentModificationException。

3) Enumeration 是一個遺留接口,用於遍歷 Vector、Hashtable。 迭代器不是遺留接口。 Iterator 可用於 HashMap、LinkedList、ArrayList、HashSet、TreeMap、TreeSet 的遍歷。

如果您正在編寫自己的集合類,並且要擴展任何現有類或實現任何集合框架接口,則基本上別無選擇,只能使用 Iterator。

如果出於某種原因(我無法想到)您正在創建一個與 java.util.Collection 或 java.util.Map 沒有任何關系的自定義集合類,您仍然應該實現 Iterable 以便人們可以使用你的課程在 for 循環中。

主要的不同是 Enumeration 不公開 remove() 方法。 此外,迭代器不允許對底層對象同時進行導航和修改。 他們可以控制查看是否有並發修改等,因此需要更多的處理。 所以 Enumeration 的性能實際上比 Iterator 快 50%。 如果我們只需要忽略這種同步的導航,只需使用枚舉。

Enumeration 只能用於遺留類(Vector, Stack...),而 Iterator 可以用於所有。

迭代器和枚舉都用於檢索數據,區別在於枚舉只能用於遺留類,即向量/堆棧,而迭代器可用於其余類。 枚舉也可用於映射中的鍵集。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM