2009-06-04 64 views
102

這兩個接口之間的確切區別是什麼? Enumeration對使用​​Iterator有好處嗎?如果有人可以詳細說明,請參考文章。Java枚舉和迭代器之間的區別

+3

我用谷歌搜索,第一個結果是在JavaRanch中關於[Enumeration vs Iterator](http://www.coderanch.com/t/202139/Performance/java/Enumeration-vs-Iterator)的一個有趣的討論 – 2009-06-04 01:41:48

回答

124

看爲Iterator接口的Java API規範,存在的差異Enumeration之間的解釋:

迭代器從 枚舉有兩點不同:

  • 迭代允許呼叫者在迭代期間使用明確定義的語義從 集合中移除元素。
  • 方法名稱已被改進。

底線是,既EnumerationIterator會給連續元素,但Iterator以這樣的方式改進,使該方法名是短,並且有一個附加remove方法。這裏是側方比較:

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

如在Java API規範中也提到,對於新的程序,Iterator應優於Enumeration,爲「迭代器採用枚舉的地方在Java集合框架「。 (來自Iterator規範。)

+6

我認爲關於併發性的這個答案有一些解釋。 – 2012-07-24 16:01:20

+0

@Paul_Draper:編輯不應該爲帖子增加新的含義,那是什麼意見。 – Emil 2012-11-11 17:40:59

+2

@coobird你確定「枚舉通常更快」嗎?因爲枚舉具有「在nextElement()內部同步代碼塊」並且我們在Iterators中沒有引起ConcurrentModificationException rit的同步我們稱之爲迭代器通常更快,枚舉更安全一些。 ?? – 2013-03-04 08:39:35

11

「正式」,它們應該與支持額外操作(例如,刪除)的迭代器接口類似。一般來說,趨勢是使用迭代器。

這裏是the enumeration interface javadocs

注:此接口的功能由 Iterator接口複製。另外, 迭代器添加了一個可選的刪除 操作,並且有更短的方法 名稱。新的實現應該 考慮使用Iterator優先 枚舉。

2

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

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

2

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

-1

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

31

迭代器快速失敗。即當一個線程通過添加/刪除操作改變集合,而另一個線程使用hasNext() or next()方法通過迭代器遍歷它時,迭代器通過拋出ConcurrentModificationException快速失敗。迭代器的快速失敗行爲只能用於檢測錯誤。通過像Hashtable,Vector這樣的類的方法返回的Enumerations不是快速失敗,這是通過同步鎖定當前Vector對象的方法中的代碼塊實現的,該方法花費了大量時間。

6

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

4

有一個在枚舉和Iterator三個基本差異

枚舉
1.它是使用僅用於lagacy類(例如Vector

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

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

  • public boolean hasNextElement();
  • public Object nextElement();

迭代

  1. 它是適用於所有收集

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

  3. 三種方法都可以

    • public boolean hasNext();
    • public Object next();
    • public void remove();

Limition在兩個

  • 只能向前移動方向
  • 沒有用於Add object任何方法和Replace object
0

枚舉可以僅用於遺留類(Vector,Stack ...),而迭代器可以用於所有。