这两个接口之间的确切区别是什么?Enumeration
比使用有好处吗Iterator
?如果有人可以详细说明,将不胜感激参考文章。
10 回答
查看Iterator
接口的 Java API 规范,有一个解释Enumeration
:
迭代器在两个方面不同于枚举:
- 迭代器允许调用者在具有明确定义的语义的迭代期间从底层集合中删除元素。
- 方法名称已得到改进。
底线是,两者都Enumeration
将Iterator
给出连续的元素,但Iterator
通过缩短措辞改进了方法名称,并且它还有一个附加remove
方法。这是一个并排的比较:
Enumeration Iterator
---------------- ----------------
hasMoreElements() hasNext()
nextElement() next()
N/A remove()
正如 Java API 规范中也提到的,对于较新的程序,Iterator
应该优先使用Enumeration
,因为“迭代器在 Java 集合框架中取代了枚举”。(根据Iterator
规格。)
迭代器是快速失败的。即,当一个线程通过添加/删除操作更改集合,而另一个线程通过 Iterator usinghasNext() or next()
方法遍历它时,迭代器通过 throw 快速失败ConcurrentModificationException
。迭代器的快速失败行为只能用于检测错误。Hashtable、Vector 等类的方法返回的枚举不是快速失败的,这是通过同步nextElement()
锁定当前 Vector 对象的方法中的代码块来实现的,这会花费大量时间。
“正式地”,它们应该与支持额外操作(例如,删除)的迭代器接口相似。通常,趋势是使用迭代器。
这是来自枚举接口 javadocs:
注意:此接口的功能与迭代器接口相同。此外,Iterator 添加了一个可选的删除操作,并且具有更短的方法名称。新的实现应该考虑使用迭代器而不是枚举。
一个简单的事实,但在以前的答案中没有提到Iterator<T>
是用于Iterable<T>
解释for(_type_ element:collection){...}
结构。
枚举和迭代器有基本的三个区别
枚举
1. 它仅用于 lagacy 类(例如Vector
)
Enumeration e = v.elements();
v is the object of `Vector` class
2. 可以进行读操作,不能删除元素。
3. 两种方法可用
- 公共布尔 hasNextElement();
- 公共对象 nextElement();
迭代器
它适用于所有集合
Iterator itr = c.iterator(); where c is any `Collection` class
可以执行读取和删除操作
三种方法可用
- 公共布尔 hasNext();
- 公共对象下一个();
- 公共无效删除();
两者都有限制
- 仅向前移动
- 没有任何方法
Add object
和Replace object
1) Iterator 和 Enumeration 之间的主要区别是在遍历集合时删除元素。迭代器可以在遍历集合期间删除元素,因为它具有 remove() 方法。枚举没有 remove() 方法。
2) 枚举本质上是故障安全的。如果在遍历期间修改了 Collection,它不会抛出 ConcurrentModificationException。迭代器本质上是快速失败的。如果在迭代时修改了 Collection 而不是它自己的 remove() 方法,它会抛出 ConcurrentModificationException。
3) Enumeration 是一个遗留接口,用于遍历 Vector、Hashtable。迭代器不是遗留接口。Iterator 可用于 HashMap、LinkedList、ArrayList、HashSet、TreeMap、TreeSet 的遍历。
如果您正在编写自己的集合类,并且您正在扩展任何现有的类或实现任何 Collections 框架接口,那么您基本上别无选择,只能使用 Iterator。
如果出于某种原因(我想不出)你正在创建一个与 java.util.Collection 或 java.util.Map 无关的自定义集合类,你仍然应该实现 Iterable 以便人们可以使用你的类在 for 循环中。
主要区别在于枚举不公开 remove() 方法。此外,Iterator 不允许同时对底层对象进行导航和修改。他们可以控制是否有并发修改,因此需要更多处理。因此,Enumeration 的性能几乎比 Iterator 快 50%。如果我们只需要导航而忽略这种同步,只需使用枚举。
Enumeration 只能用于遗留类(Vector, Stack...),而 Iterator 可以用于所有类。
迭代器和枚举都用于检索数据,不同之处在于枚举只能用于遗留类,即向量/堆栈,而迭代器可以用于其余类。枚举也可用于映射中的键集。