Java Enumeration和Iterator之间的区别

时间:2009-06-04 01:35:16

标签: java collections iterator enumeration

这两个界面之间的确切区别是什么? Enumeration比使用Iterator有什么好处吗?如果有人可以详细说明,那么参考文章将不胜感激。

10 个答案:

答案 0 :(得分:135)

查看Iterator接口的Java API规范,解释了Enumeration之间的差异:

  

迭代器不同于   枚举有两种方式:

     
      
  • 迭代器允许调用者从底层删除元素   迭代期间的集合   明确定义的语义。
  •   
  • 方法名称已得到改进。
  •   

最重要的是,EnumerationIterator都会提供连续的元素,但Iterator会以这样的方式得到改进,因此方法名称更短,并且还有一个remove 1}}方法。这是一个并排比较:

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

正如Java API规范中所提到的,对于较新的程序,Iterator应优先于Enumeration,因为“Iterator取代了Java集合框架中的Enumeration”。 (来自Iterator规范。)

答案 1 :(得分:35)

迭代器快速失败。即当一个线程通过添加/删除操作更改集合,而另一个线程使用hasNext() or next()方法通过迭代器遍历它时,迭代器会通过抛出ConcurrentModificationException而快速失败。迭代器的快速失败行为只能用于检测错误。像Hashtable,Vector这样的类的方法返回的枚举不是快速失败的,这是通过同步锁定当前Vector对象的nextElement()方法内的代码块来实现的,这需要花费大量时间。

答案 2 :(得分:11)

“正式”,它们应该与支持额外操作(例如,删除)的迭代器接口类似。通常,趋势是使用迭代器。

此处来自the enumeration interface javadocs

  

注意:此接口的功能由   迭代器接口。此外,   Iterator添加了一个可选的删除   操作,并有较短的方法   名。新的实现应该   考虑优先使用Iterator   到枚举。

答案 3 :(得分:6)

一个简单的事实,但在之前的答案中没有提到,Iterator<T>Iterable<T>一起用于解释for(_type_ element:collection){...}结构。

答案 4 :(得分:5)

Enumeration和Iterator有三个基本区别

<强>枚举
 1.它仅用于延迟类(例如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();
  4. 限制

    • 仅向前移动
    • Add objectReplace object
    • 没有任何方法

答案 5 :(得分:2)

如果您正在编写自己的集合类,并且您正在扩展任何现有类或实现任何集合框架接口,那么您基本上别无选择,只能使用Iterator。

如果由于某种原因(我无法想到)你正在以任何方式创建一个与java.util.Collection或java.util.Map无关的自定义集合类,你应该仍然实现Iterable,以便人们可以在for循环中使用你的类。

答案 6 :(得分:2)

主要不同的是Enumeration不公开remove()方法。此外,迭代器不允许同时导航和修改底层对象。他们有一个控件来查看是否有并发修改,因此需要更多的处理。因此Enumeration的性能几乎比Iterator快50%。如果我们只需要忽略这种同步的导航,只需使用Enumeration。

答案 7 :(得分:2)

1)Iterator和Enumeration之间的主要区别是删除了元素 在遍历集合时。迭代器可以在遍历集合期间删除元素,因为它具有remove()方法。枚举没有remove()方法。

2)枚举本质上是故障安全的。如果在遍历期间修改Collection,则不会引发ConcurrentModificationException。 迭代器本质上是快速失败的。如果在迭代而不是其自身的remove()方法的同时修改了Collection,则会抛出ConcurrentModificationException。

3)枚举是一个传统接口,用于遍历Vector,Hashtable。 迭代器不是旧版接口。迭代器可用于遍历HashMap,LinkedList,ArrayList,HashSet,TreeMap,TreeSet。

答案 8 :(得分:0)

枚举只能用于遗留类(Vector,Stack ...),而Iterator可以用于所有。

答案 9 :(得分:-1)

迭代器和枚举都用于检索数据,不同之处在于枚举只能用于遗留类,即vector / stack,而迭代器可用于其余部分。枚举也可用于映射中的键集。