這兩個接口之間的確切區別是什麼? Enumeration
對使用Iterator
有好處嗎?如果有人可以詳細說明,請參考文章。Java枚舉和迭代器之間的區別
回答
看爲Iterator
接口的Java API規範,存在的差異Enumeration
之間的解釋:
迭代器從 枚舉有兩點不同:
- 迭代允許呼叫者在迭代期間使用明確定義的語義從 集合中移除元素。
- 方法名稱已被改進。
底線是,既Enumeration
和Iterator
會給連續元素,但Iterator
以這樣的方式改進,使該方法名是短,並且有一個附加remove
方法。這裏是側方比較:
Enumeration Iterator
---------------- ----------------
hasMoreElement() hasNext()
nextElement() next()
N/A remove()
如在Java API規範中也提到,對於新的程序,Iterator
應優於Enumeration
,爲「迭代器採用枚舉的地方在Java集合框架「。 (來自Iterator
規範。)
我認爲關於併發性的這個答案有一些解釋。 – 2012-07-24 16:01:20
@Paul_Draper:編輯不應該爲帖子增加新的含義,那是什麼意見。 – Emil 2012-11-11 17:40:59
@coobird你確定「枚舉通常更快」嗎?因爲枚舉具有「在nextElement()內部同步代碼塊」並且我們在Iterators中沒有引起ConcurrentModificationException rit的同步我們稱之爲迭代器通常更快,枚舉更安全一些。 ?? – 2013-03-04 08:39:35
「正式」,它們應該與支持額外操作(例如,刪除)的迭代器接口類似。一般來說,趨勢是使用迭代器。
這裏是the enumeration interface javadocs:
注:此接口的功能由 Iterator接口複製。另外, 迭代器添加了一個可選的刪除 操作,並且有更短的方法 名稱。新的實現應該 考慮使用Iterator優先 枚舉。
如果您正在編寫自己的集合類,並且要擴展任何現有類或實現任何集合框架接口,則基本上只能使用Iterator。
如果由於某種原因(我無法想象)您正在創建一個與java.util.Collection或java.util.Map無關的自定義集合類,您應該仍然使用實現Iterable,以便人們可以在你的循環中使用你的類。
主要的不同是Enumeration不公開remove()方法。而且,迭代器不允許同時在基礎對象上進行導航和修改。他們有一個控制來查看是否有併發的修改,因此需要更多的處理。所以Enumeration的性能比Iterator快50%。如果我們只需要忽略這種同步的導航,只需使用枚舉。
迭代器和枚舉都用於檢索數據,區別在於枚舉只能用於遺留類,即向量/堆棧,而迭代器可用於其餘部分。枚舉也可以用於地圖中的鍵集。
迭代器快速失敗。即當一個線程通過添加/刪除操作改變集合,而另一個線程使用hasNext() or next()
方法通過迭代器遍歷它時,迭代器通過拋出ConcurrentModificationException
快速失敗。迭代器的快速失敗行爲只能用於檢測錯誤。通過像Hashtable,Vector這樣的類的方法返回的Enumerations不是快速失敗,這是通過同步鎖定當前Vector對象的方法中的代碼塊實現的,該方法花費了大量時間。
一個簡單的事實,但在以前的答案中沒有提到的是,Iterator<T>
與Iterable<T>
一起使用來解釋for(_type_ element:collection){...}
結構。
有一個在枚舉和Iterator三個基本差異
枚舉
1.它是使用僅用於lagacy類(例如Vector
)
Enumeration e = v.elements();
v is the object of `Vector` class
2.讀操作可以被執行,我們不能刪除元素。
3.有兩種方法可用
- public boolean hasNextElement();
- public Object nextElement();
迭代
它是適用於所有收集
Iterator itr = c.iterator(); where c is any `Collection` class
讀取和刪除操作可以執行
三種方法都可以
- public boolean hasNext();
- public Object next();
- public void remove();
Limition在兩個
- 只能向前移動方向
- 沒有用於
Add object
任何方法和Replace object
枚舉可以僅用於遺留類(Vector,Stack ...),而迭代器可以用於所有。
- 1. 枚舉和枚舉之間的區別
- 2. scala和java枚舉之間的區別
- 3. java中枚舉數與枚舉之間的區別
- 4. Java枚舉與迭代器
- 5. 迭代枚舉值之間的C#
- 6. Java:迭代器和陣列列表之間的區別
- 7. 如何區分標誌枚舉和普通枚舉之間的區別?
- 8. 如何迭代Java枚舉?
- 9. 如何檢測使用libclang的枚舉和範圍枚舉之間的區別?
- 10. Java枚舉列表迭代器問題
- 11. 枚舉:使用枚舉和類與靜態變量之間的區別
- 12. 枚舉之間的區別<?擴展ZipEntry>和枚舉<ZipEntry>?
- 13. '枚舉:類型'和簡單'枚舉'之間的區別是什麼
- 14. 迭代器,ListIterartor和枚舉的實例
- 15. 轉換枚舉迭代器
- 16. 枚舉和定義語句之間的區別
- 17. stl迭代器的postfix和前綴增量之間的區別?
- 18. 輸入迭代器和只讀前向迭代器之間有什麼區別?
- 19. `迭代器`和`元素引用之間的區別`
- 20. Spark toLocalIterator和迭代器方法之間的區別
- 21. Scala中迭代器和流之間的區別?
- 22. 方法迭代器和視圖之間有什麼區別?
- 23. Java:枚舉和值類之間有什麼區別(也在使用中)?
- 24. C中的枚舉聲明之間的區別?
- 25. Directcast和Ctype與枚舉的區別
- 26. smarty中的foreach和迭代之間的區別
- 27. JavaScript中循環的迭代器和生成器之間的區別
- 28. 將枚舉器/對象迭代到流
- 29. 如何迭代枚舉?
- 30. 迭代非枚舉屬性
我用谷歌搜索,第一個結果是在JavaRanch中關於[Enumeration vs Iterator](http://www.coderanch.com/t/202139/Performance/java/Enumeration-vs-Iterator)的一個有趣的討論 – 2009-06-04 01:41:48