Java Iterator、Enumeration

一、概述

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应仅用于检测错误

五、参考资料

  1. Differences Between Enumeration Vs Iterator In Java
  2. Enumeration.java和Iterator.java
  3. Difference between Java Enumeration and Iterator
  4. Class ConcurrentModificationException

你可能感兴趣的:(Java Iterator、Enumeration)