这两个界面之间的确切区别是什么? Enumeration
比使用Iterator
有什么好处吗?如果有人可以详细说明,那么参考文章将不胜感激。
答案 0 :(得分:135)
查看Iterator
接口的Java API规范,解释了Enumeration
之间的差异:
迭代器不同于 枚举有两种方式:
- 迭代器允许调用者从底层删除元素 迭代期间的集合 明确定义的语义。
- 方法名称已得到改进。
最重要的是,Enumeration
和Iterator
都会提供连续的元素,但Iterator
会以这样的方式得到改进,因此方法名称更短,并且还有一个remove
1}}方法。这是一个并排比较:
Enumeration Iterator
---------------- ----------------
hasMoreElement() hasNext()
nextElement() next()
N/A remove()
正如Java API规范中所提到的,对于较新的程序,Iterator
应优先于Enumeration
,因为“Iterator取代了Java集合框架中的Enumeration”。 (来自Iterator
规范。)
答案 1 :(得分:35)
迭代器快速失败。即当一个线程通过添加/删除操作更改集合,而另一个线程使用hasNext() or next()
方法通过迭代器遍历它时,迭代器会通过抛出ConcurrentModificationException
而快速失败。迭代器的快速失败行为只能用于检测错误。像Hashtable,Vector这样的类的方法返回的枚举不是快速失败的,这是通过同步锁定当前Vector对象的nextElement()
方法内的代码块来实现的,这需要花费大量时间。
答案 2 :(得分:11)
“正式”,它们应该与支持额外操作(例如,删除)的迭代器接口类似。通常,趋势是使用迭代器。
此处来自the enumeration interface javadocs:
注意:此接口的功能由 迭代器接口。此外, Iterator添加了一个可选的删除 操作,并有较短的方法 名。新的实现应该 考虑优先使用Iterator 到枚举。
答案 3 :(得分:6)
一个简单的事实,但在之前的答案中没有提到,Iterator<T>
与Iterable<T>
一起用于解释for(_type_ element:collection){...}
结构。
答案 4 :(得分:5)
Enumeration和Iterator有三个基本区别
<强>枚举强>
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
答案 5 :(得分:2)
如果您正在编写自己的集合类,并且您正在扩展任何现有类或实现任何集合框架接口,那么您基本上别无选择,只能使用Iterator。
如果由于某种原因(我无法想到)你正在以任何方式创建一个与java.util.Collection或java.util.Map无关的自定义集合类,你应该仍然实现Iterable,以便人们可以在for循环中使用你的类。
答案 6 :(得分:2)
主要不同的是Enumeration不公开remove()方法。此外,迭代器不允许同时导航和修改底层对象。他们有一个控件来查看是否有并发修改,因此需要更多的处理。因此Enumeration的性能几乎比Iterator快50%。如果我们只需要忽略这种同步的导航,只需使用Enumeration。
答案 7 :(得分:2)
1)Iterator和Enumeration之间的主要区别是删除了元素 在遍历集合时。迭代器可以在遍历集合期间删除元素,因为它具有remove()方法。枚举没有remove()方法。
2)枚举本质上是故障安全的。如果在遍历期间修改Collection,则不会引发ConcurrentModificationException。 迭代器本质上是快速失败的。如果在迭代而不是其自身的remove()方法的同时修改了Collection,则会抛出ConcurrentModificationException。
3)枚举是一个传统接口,用于遍历Vector,Hashtable。 迭代器不是旧版接口。迭代器可用于遍历HashMap,LinkedList,ArrayList,HashSet,TreeMap,TreeSet。
答案 8 :(得分:0)
枚举只能用于遗留类(Vector,Stack ...),而Iterator可以用于所有。
答案 9 :(得分:-1)
迭代器和枚举都用于检索数据,不同之处在于枚举只能用于遗留类,即vector / stack,而迭代器可用于其余部分。枚举也可用于映射中的键集。