一、概述
Enumeration和Iterator都在java.util包下,用于遍历Collection对象的元素
二、区别
1)简介
Iterator是JDK 1.2引入的,Enumeration是JDK 1.0引入的
2)remove()方法
这是两者之间最主要的差别,Enumeration只支持遍历,不支持修改(remove)
Iterator | Enumeration |
---|---|
hasNext() | hasMoreElements() |
next() | hasElement() |
remove() | / |
3)老旧接口
Enumeration是老旧接口,仅用于遍历老旧类如Vector、HashTable、Stack;而Iterator更通用
4)Fail-Fast VS Fail-Safe
- Iterator本质上是一种Fail-Fast, 即如果在迭代时修改集合而不是它自己的remove()方法,则抛出ConcurrentModificationException;
- Enumeration在本质上是Fail-Safe的,如果在迭代时修改了集合,不会抛出任何异常
5)安全可靠性
由于Iterator本质上是Fail-Fast的,并且在迭代时不允许其他线程修改集合,因此它被认为比Enumeration更安全
6)命名
Iterator类名、函数名更简短
三、如何选择
根据Java API文档说明,始终应该优先使用Iterator
四、Fail-Fast的额外说明
- 发生Fail-Fast时抛出ConcurrentModificationException的行为不是在接口中定义的,它取决于Iterator的具体实现;
- java.util.concurrent包下的collection类永远不会抛ConcurrentModificationException;
- 请注意,无法保证Fail-fast的行为,因为一般来说,在存在不同步的并发修改时,不可能做出任何硬性保证。 Fail-Fast操作会尽最大努力抛出ConcurrentModificationException。 因此,编写依赖于此异常的程序以确保其正确性是错误的:ConcurrentModificationException应仅用于检测错误。
网友评论