Java 枚举与迭代器的区别

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

95038 次浏览

查看 Iterator接口的 JavaAPI 规范,可以解释 Enumeration之间的区别:

迭代器与 枚举有两种方式:

  • 迭代器允许调用方从基础 集合 定义明确的语义学。
  • 方法名称已得到改进。

底线是,EnumerationIterator都将给出连续的元素,但是 Iterator通过缩短冗长来改进方法名称,并且它还有一个额外的 remove方法。下面是一个并列比较:

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

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

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

以下是来自 枚举接口 javadocs的报道:

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

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

如果出于某种原因(我想不起来) ,您正在创建一个与 java.util 无关的自定义集合类。集合或 java.util。以任何方式映射,您都应该实现 还是 Iterable,这样人们就可以在 for 循环中使用您的类。

主要的不同之处在于枚举不公开 remove ()方法。此外,Iterator 不允许同时对底层对象进行导航和修改。它们有一个控件来查看是否存在并发修改,因此需要进行更多的处理。因此枚举的性能实际上比迭代器快50% 。如果我们只需要忽略这种同步的导航,那么只需使用枚举。

迭代器和枚举都用于检索数据,区别在于枚举只能用于遗留类,即向量/堆栈,而迭代器可用于其余类。枚举还可以用于映射中的键集。

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

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

枚举和 Iterator 有三个基本区别

枚举
1. 仅用于滞后类(如 Vector)

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

读操作可以执行,不能删除元素。
3. 有两种方法可供选择

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

迭代器

  1. 适用于所有托收

    Iterator itr = c.iterator();
    where c is any `Collection` class
    
  2. Read and Remove operation can be perform

  3. Three Method are available

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

Limition in both

  • Move only forward direction
  • There is no any methods for Add object and Replace object

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

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

2)枚举本质上是故障安全的。如果在遍历过程中对 Collection 进行了修改,它不会引发 ConcurrentModficationException。 迭代器在本质上是快速失败的。如果在迭代自己的 move ()方法以外的其他方法时修改了 Collection,则会引发 ConcurrentModficationException。

枚举是一个遗留接口,用于遍历 Vector,Hashtable。 迭代器不是遗留接口。迭代器可用于遍历 HashMap、 LinkedList、 ArrayList、 HashSet、 TreeMap、 TreeSet。