enumeration是jdk 1.0中迭代器模式的简化版,仅含hasmoreelements()和nextelement(),支持单向只读遍历;iterator自jdk 1.2起成为标准,增加remove()、fail-fast机制及统一命名,全面替代enumeration。

Enumeration 是早期迭代器模式的简化实现
Enumeration 接口诞生于 JDK 1.0,本质是迭代器模式(Iterator Pattern)在 Java 初期的轻量级落地。它只暴露两个方法:hasMoreElements() 和 nextElement(),职责明确:仅支持单向、只读遍历。这种设计符合 GOF 对迭代器模式“解耦容器与遍历逻辑”的核心思想,但省略了修改能力与安全机制,属于模式的最小可行版本。
Iterator 是迭代器模式的完整标准化演进
Iterator 自 JDK 1.2 起成为集合框架(Collections Framework)的统一遍历契约,是对同一模式的增强实现:
- 增加 remove() 方法,使遍历与结构性修改(如删除当前元素)可在同一抽象层完成,避免外部直接调用集合的 remove 导致并发异常
- 方法命名更简洁一致(hasNext()/next()),降低认知负担
- 内置 fail-fast 检测逻辑,在遍历中检测到集合被意外修改时主动抛出 ConcurrentModificationException,提升调试可追溯性
- 所有标准集合类(ArrayList、HashMap、LinkedList 等)均原生实现 Iterator,而 Enumeration 仅由 Vector、Hashtable 等遗留类提供
二者在模式角色定位上存在代际差异
Enumeration 更接近“枚举器”(Enumerator)——强调对已有数据的顺序呈现;Iterator 则真正承担“游标”(Cursor)角色,既定位当前元素,又支持在位置上执行操作。这种差异反映在接口契约层面:
- Enumeration 不承诺线程安全或修改感知,其行为依赖具体实现类(如 Vector.elements() 返回同步包装的枚举)
- Iterator 将遍历状态(游标位置)、访问控制(hasNext/next)、副作用管理(remove)封装为不可分割的语义单元,使模式意图更清晰、行为更可控
实际编码中应优先使用 Iterator
除非维护 JDK 1.0–1.1 时代的遗留代码,或对接极少数仍强制返回 Enumeration 的旧 API(如某些 JNDI 或早期 Servlet 容器接口),否则不应主动选择 Enumeration。现代 Java 开发中,Iterator 已成为迭代器模式的事实标准实现,兼顾表达力、安全性与生态一致性。










