[英]Difference between Java Enumeration and Iterator
查看Iterator
接口的 Java API 规范,有对Enumeration
之间差异的解释:
迭代器在两个方面不同于枚举:
- 迭代器允许调用者在具有明确定义语义的迭代期间从底层集合中删除元素。
- 方法名称已得到改进。
最重要的是, Enumeration
和Iterator
都会给出连续的元素,但Iterator
通过缩短措辞改进了方法名称,并且它有一个额外的remove
方法。 这是一个并排的比较:
Enumeration Iterator
---------------- ----------------
hasMoreElements() hasNext()
nextElement() next()
N/A remove()
正如 Java API 规范中所提到的,对于较新的程序, Iterator
应该优先于Enumeration
,因为“Iterator 取代了 Java 集合框架中的 Enumeration”。 (来自Iterator
规范。)
迭代器是快速失败的。 即,当一个线程通过添加/删除操作更改集合,而另一个线程使用hasNext() or next()
方法通过 Iterator 遍历它时,迭代器会通过抛出ConcurrentModificationException
迅速失败。 迭代器的快速失败行为只能用于检测错误。 由 Hashtable、Vector 等类的方法返回的枚举不是快速失败的,这是通过同步nextElement()
方法内的代码块来实现的,该方法锁定当前的 Vector 对象,这会花费大量时间。
“正式地”,它们应该类似于支持额外操作(例如,删除)的迭代器接口。 通常,倾向于使用迭代器。
这是来自枚举接口 javadocs :
注意:此接口的功能由 Iterator 接口复制。 此外,Iterator 添加了一个可选的删除操作,并具有较短的方法名称。 新的实现应该考虑使用 Iterator 而不是 Enumeration。
一个简单但在之前的答案中没有提到的事实是Iterator<T>
与Iterable<T>
一起用于解释for(_type_ element:collection){...}
结构。
枚举和迭代器有基本的三个区别
枚举
1. 它仅用于滞后类(例如Vector
)
Enumeration e = v.elements();
v is the object of `Vector` class
2. 可以执行读操作,不能删除元素。
3. 两种方法可用
迭代器
它适用于所有收藏
Iterator itr = c.iterator(); where c is any `Collection` class
可以执行读取和删除操作
三种方法可用
Limition两个
Add object
和Replace object
没有任何方法1) Iterator 和 Enumeration 的主要区别在于遍历集合时移除元素。 迭代器可以在遍历集合期间移除元素,因为它具有 remove() 方法。 枚举没有 remove() 方法。
2) 枚举本质上是故障安全的。 如果在遍历过程中修改了 Collection,则不会抛出 ConcurrentModificationException。 迭代器本质上是快速失败的。 如果在迭代它自己的 remove() 方法以外的时候修改了一个集合,它会抛出 ConcurrentModificationException。
3) Enumeration 是一个遗留接口,用于遍历 Vector、Hashtable。 迭代器不是遗留接口。 Iterator 可用于 HashMap、LinkedList、ArrayList、HashSet、TreeMap、TreeSet 的遍历。
如果您正在编写自己的集合类,并且要扩展任何现有类或实现任何集合框架接口,则基本上别无选择,只能使用 Iterator。
如果出于某种原因(我无法想到)您正在创建一个与 java.util.Collection 或 java.util.Map 没有任何关系的自定义集合类,您仍然应该实现 Iterable 以便人们可以使用你的课程在 for 循环中。
主要的不同是 Enumeration 不公开 remove() 方法。 此外,迭代器不允许对底层对象同时进行导航和修改。 他们可以控制查看是否有并发修改等,因此需要更多的处理。 所以 Enumeration 的性能实际上比 Iterator 快 50%。 如果我们只需要忽略这种同步的导航,只需使用枚举。
Enumeration 只能用于遗留类(Vector, Stack...),而 Iterator 可以用于所有。
迭代器和枚举都用于检索数据,区别在于枚举只能用于遗留类,即向量/堆栈,而迭代器可用于其余类。 枚举也可用于映射中的键集。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.