Java枚举与迭代器的区别
这两个接口有什么区别? Enumeration
是否比使用Iterator
有好处? 如果有人可以详细说明,请参考文章,将不胜感激。
查看Iterator
接口的Java API规范,对Enumeration
之间的区别有一个解释:
迭代器在两个方面与枚举不同:
- 迭代器允许调用者在迭代期间使用明确定义的语义从底层集合中移除元素。
- 方法名称已被改进。
底线是Enumeration
和Iterator
都会给出连续的元素,但是Iterator
是这样改进的,所以方法名称更短,并且有一个额外的remove
方法。 这是一个并排比较:
Enumeration Iterator ---------------- ---------------- hasMoreElement() hasNext() nextElement() next() N/A remove()
正如Java API规范中提到的,对于较新的程序, Iterator
应该优于Enumeration
,因为“Iterator在Java集合框架中代替Enumeration”。 (来自Iterator
规范。)
迭代器是快速失败的 。 即当一个线程通过添加/删除操作改变集合,而另一个线程使用hasNext() or next()
方法通过Iterator遍历它时,迭代器通过抛出ConcurrentModificationException
快速失败。 迭代器的快速失败行为只能用于检测错误。 像Hashtable,Vector这样的类的方法返回的枚举不是快速失败的,它是通过同步nextElement()
方法中的代码块来实现的,该方法locking当前的Vector对象,这会花费大量的时间。
“官方”,他们应该是类似的迭代器接口支持额外的操作(例如,删除)。 通常,趋势是使用迭代器。
这里是从枚举接口javadocs :
注:该接口的function由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.有两种方法可用
- public boolean hasNextElement();
- public Object nextElement();
迭代器
-
它适用于所有collections
Iterator itr = c.iterator(); where c is any `Collection` class
-
可以执行读取和删除操作
-
三种方法可用
- public boolean hasNext();
- public Object next();
- public void remove();
两者都有限制
- 只能向前移动
- 没有任何
Add object
和Replace object
如果你正在编写你自己的集合类,而且你正在扩展任何现有的类或实现任何的集合框架接口,你基本上只能使用Iterator。
如果由于某种原因(我想不出来)你创build一个自定义的集合类,以任何方式与java.util.Collection或java.util.Map没有关系,你仍然应该实现Iterable,以便人们可以使用你的课在for循环。
主要的不同是Enumeration不公开remove()方法。 而且,迭代器不允许同时在基础对象上进行导航和修改。 他们有一个控制,看看是否有并发的修改,因此需要更多的处理。 所以Enumeration的性能比Iterator快了50%。 如果我们只需要导航忽略这样的同步,只需使用枚举。
枚举只能用于遗留类(Vector,Stack …),而Iterator可以用于所有类。
迭代器和枚举都用来检索数据,区别在于枚举只能用于遗留类,如向量/堆栈,而迭代器可用于其余部分。 枚举也可以用于映射中的键集。