这两个接口之间的确切区别是什么? 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. scala和java枚举之间的区别
- 2. java中枚举数与枚举之间的区别
- 3. Java:迭代器和阵列列表之间的区别
- 4. 如何区分标志枚举和普通枚举之间的区别?
- 5. 如何检测使用libclang的枚举和范围枚举之间的区别?
- 6. 枚举:使用枚举和类与静态变量之间的区别
- 7. 枚举之间的区别<?扩展ZipEntry>和枚举<ZipEntry>?
- 8. 转换枚举迭代器
- 9. 枚举和定义语句之间的区别
- 10. 输入迭代器和只读前向迭代器之间有什么区别?
- 11. Scala中迭代器和流之间的区别?
- 12. 方法迭代器和视图之间有什么区别?
- 13. Directcast和Ctype与枚举的区别
- 14. smarty中的foreach和迭代之间的区别
- 15. JavaScript中循环的迭代器和生成器之间的区别
- 16. 将枚举器/对象迭代到流
- 17. 迭代行与while和数组赋值之间的区别
- 18. 索引和迭代器的区别是?
- 19. Java和C#和.NET之间的区别
- 20. 不能理解游戏中的迭代器,枚举器,枚举器2.0
- 21. java类和jar之间的区别
- 22. Java Point,getX()和point.x之间的区别
- 23. Java - javax.crypto.Mac和javax.crypto.Cipher之间的区别?
- 24. Authenticode,SPC和Java CodeSign之间的区别?
- 25. '。'之间的区别和“。” in java
- 26. MongoDB Java API:com.mongodb.DBCollection.Save()和com.mongodb.DBCollection.Insert()之间的区别?
- 27. objective-c和java之间的区别
- 28. Apache Struts和Java EE之间的区别?
- 29. Java中= +和+ =之间的区别?
- 30. Short.parseShort和Short.value之间的Java区别
我用谷歌搜索,第一个结果是在JavaRanch中关于[Enumeration vs Iterator](http://www.coderanch.com/t/202139/Performance/java/Enumeration-vs-Iterator)的一个有趣的讨论 – 2009-06-04 01:41:48