Java Enumeration和Iterator之间的区别

问题

这两个接口之间的确切区别是什么?有没有比使用Iterator好的Enumeration?如果有人可以详细说明,参考文章将不胜感激。


#1 热门回答(131 赞)

查看Iterator接口的Java API规范,解释了Enumeration之间的差异:

迭代器与枚举的不同之处在于两种方式:迭代器允许调用者在迭代期间使用明确定义的语义从底层集合中删除元素。方法名称已得到改进。

底线是,38825468和Iterator都会给出连续的元素,但是Iterator会以这种方式得到改进,所以方法名称更短,并且有一个额外的remove方法。这是一个并排比较:

Enumeration                     Iterator
  ----------------                ----------------
  hasMoreElement()                hasNext()
  nextElement()                   next()
  N/A                             remove()

正如Java API规范中所提到的,对于较新的程序,Iterator应优先于Enumeration,因为"Iterator取代了Java集合框架中的Enumeration"。 (来自Iterator规格。)


#2 热门回答(33 赞)

迭代器快速失败。即当一个线程通过添加/删除操作更改集合,而另一个线程通过迭代器使用hasNext() or next()方法遍历它时,迭代器会通过投掷ConcurrentModificationException快速失败。迭代器的快速失败行为只能用于检测错误。像Hashtable,Vector这样的类的方法返回的枚举不是快速失败的,这是通过同步锁定当前Vector对象的代码块来实现的,这会占用大量时间。


#3 热门回答(11 赞)

"正式",它们应该与支持额外操作(例如,删除)的迭代器接口类似。通常,趋势是使用迭代器。

这是从the enumeration interface javadocs

注意:此接口的功能由Iterator接口复制。此外,Iterator添加了一个可选的删除操作,并且具有更短的方法名称。新实现应考虑使用Iterator而不是Enumeration。