2009-06-04 83 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 ...),而迭代器可以用于所有。

相关问题