这两个接口之间的确切区别是什么?是否Enumeration
有过使用效益Iterator
?如果有人可以详细说明,请参考本文。
这两个接口之间的确切区别是什么?是否Enumeration
有过使用效益Iterator
?如果有人可以详细说明,请参考本文。
Answers:
查看该Iterator
接口的Java API规范,对以下两者之间的区别进行了说明Enumeration
:
迭代器与枚举有以下两种不同:
- 迭代器允许调用者在迭代期间使用定义明确的语义从基础集合中删除元素。
- 方法名称已得到改进。
底线是,既Enumeration
和Iterator
会给连续元素,但Iterator
以这样的方式得到改善,从而该方法名是短,并且具有附加的remove
方法。这是一个并排比较:
Enumeration Iterator
---------------- ----------------
hasMoreElement() hasNext()
nextElement() next()
N/A remove()
如Java API规范中所述,对于较新的程序,Iterator
应该优先于Enumeration
,因为“在Java集合框架中,迭代器代替了枚举”。(根据Iterator
规格。)
迭代器是快速失败的。例如,当一个线程通过添加/删除操作更改集合时,而另一个线程通过使用hasNext() or next()
方法的迭代器遍历该集合时,该迭代器将通过throw 快速失败ConcurrentModificationException
。迭代器的快速失败行为只能用于检测错误。由Hashtable,Vector之类的方法返回的Enumeration不是快速失败的,这是通过同步nextElement()
锁定当前Vector对象的方法中的代码块来实现的,这需要花费大量时间。
“正式地”,它们应该与支持额外操作(例如删除)的迭代器接口相似。通常,趋势是使用迭代器。
这是来自枚举接口javadocs的:
注意:此接口的功能由Iterator接口复制。此外,Iterator添加了可选的remove操作,并且具有较短的方法名称。新实现应优先考虑使用Iterator而不是Enumeration。
枚举和迭代器有三个基本区别
枚举
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
可以执行读取和删除操作
三种方法可用
两者的局限性
Add object
和Replace object
如果要编写自己的集合类,并且要扩展任何现有类或实现任何Collections框架接口,则基本上别无选择,只能使用Iterator。
如果出于某种原因(我无法想到),您正在创建一个与java.util.Collection或java.util.Map不相关的自定义集合类,则仍应实现Iterable,以便人们可以使用您的课程在for循环中。
主要区别在于枚举不公开remove()方法。而且,Iterator不允许同时导航和修改基础对象。他们可以控制是否有并发的修改,因此需要更多的处理。因此,Enumeration的性能实际上比Iterator快50%。如果只需要导航而忽略这种同步,则使用Enumeration。
1)Iterator和Enumeration之间的主要区别是遍历集合时删除元素。迭代器可以在遍历集合期间删除元素,因为它具有remove()方法。枚举没有remove()方法。
2)枚举本质上是故障安全的。如果在遍历期间修改Collection,则不会引发ConcurrentModificationException。迭代器本质上是快速失败的。如果在迭代其自身的remove()方法之外的同时修改了Collection,则抛出ConcurrentModificationException。
3)枚举是一个传统接口,用于遍历Vector,Hashtable。迭代器不是旧版接口。迭代器可用于遍历HashMap,LinkedList,ArrayList,HashSet,TreeMap,TreeSet。