Enumeration 与 Iterator 有哪些区别?
先说出你的答案
定义边界、关键机制、一个反例;P8题再补容量、失败与验证。
查看完整题解
参考回答
直接回答
Enumeration 是较早的遍历接口,提供 hasMoreElements 与 nextElement,不提供删除操作。Iterator 使用 hasNext、next,并定义可选的 remove 操作。现代集合通常用 Iterator;但是否允许删除、是否快速失败,都由具体容器和迭代器决定,不能只凭接口名判断。
讲清原理
Enumeration 主要见于 Vector、Hashtable 等旧 API。Iterator 把“走到哪个元素”保存在游标中;实现支持时,remove 删除最近一次 next 返回的元素,而不是任意一个值。调用顺序不合法会失败,不支持删除的迭代器会抛 UnsupportedOperationException。
Hashtable 的迭代器和 Enumeration 对并发修改的约定不同,这说明“Enumeration 不快速失败”也不等于它是安全的并发快照。
例子与易错点
Java 21 的 main 片段:
var values = new java.util.Vector<>(java.util.List.of("A", "B"));
var oldCursor = values.elements();
System.out.println(oldCursor.nextElement());
var cursor = values.iterator();
cursor.next();
cursor.remove();
System.out.println(values);
输出 A、[B]。代码没有在修改后继续使用旧游标。若需要一致的多线程遍历,应额外遵守容器的同步要求;仅把 Enumeration 换成 Iterator,不会自动解决竞争。
相关题:第 33 题、第 35 题、第 36 题。
和评分标准对照,你能独立回答到哪一步?
自评会安排下一次复习,不保存你的口述内容。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。