Enumeration接口和Iterator接口有哪些不同?
参考回答
Enumeration
和 Iterator
都是用于遍历集合的接口,但它们有以下主要区别:
- 引入时间:
Enumeration
是在 JDK 1.0 中引入的,用于早期的集合类(如Vector
、Hashtable
)。Iterator
是在 JDK 1.2 中引入的,并支持更广泛的集合类。
- 方法的功能:
-
“`
Enumeration
“`提供两个方法:
hasMoreElements()
:判断是否有更多元素。nextElement()
:获取下一个元素。
-
“`
Iterator
“`提供三个方法:
hasNext()
:判断是否有更多元素。next()
:获取下一个元素。remove()
:可以删除当前元素(Enumeration
不支持)。
- 支持的操作:
Enumeration
只支持只读操作,不能删除或修改集合中的元素。Iterator
支持删除操作(如果集合支持remove
方法)。
- 使用范围:
Enumeration
主要用于早期的集合类,如Vector
和Hashtable
。Iterator
是 Java Collections Framework 的一部分,用于现代集合类,如ArrayList
、HashSet
、HashMap
等。
- 线程安全性:
Enumeration
通常与同步类(如Vector
、Hashtable
)一起使用,因此在多线程环境中更常见。Iterator
并不直接支持线程安全,但可以使用并发集合或同步机制来实现。
详细讲解与拓展
1. 为什么引入 Iterator?
Enumeration
的功能简单,只能逐一读取元素,无法进行修改操作。这种设计满足不了后续集合框架中对灵活性和功能的需求。因此,Iterator
被引入,它不仅能遍历元素,还能通过 remove
方法直接修改集合。
2. Enumeration 和 Iterator 的方法对比
特性 | Enumeration | Iterator |
---|---|---|
方法名称 | hasMoreElements() |
hasNext() |
nextElement() |
next() |
|
无 | remove() |
|
设计用途 | 只读遍历 | 遍历和可选修改 |
可操作的集合 | Vector 、Hashtable |
任何实现了 Collection 的类 |
示例代码对比:
- Enumeration 示例:
Vector<String> vector = new Vector<>(); vector.add("A"); vector.add("B"); Enumeration<String> enumeration = vector.elements(); while (enumeration.hasMoreElements()) { System.out.println(enumeration.nextElement()); }
- Iterator 示例:
List<String> list = new ArrayList<>(); list.add("A"); list.add("B"); Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { System.out.println(iterator.next()); iterator.remove(); // 删除当前元素 }
3. 线程安全性的区别
Enumeration
通常与线程安全的集合(如 Vector
和 Hashtable
)一起使用。而 Iterator
本身并不保证线程安全性,例如在多线程环境中对集合进行修改时使用普通的 Iterator
会抛出 ConcurrentModificationException
。
要实现线程安全,可以使用 ConcurrentHashMap 或 CopyOnWriteArrayList 等并发集合。
示例:
List<String> list = new CopyOnWriteArrayList<>();
list.add("A");
list.add("B");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next()); // 不会抛出 ConcurrentModificationException
}
4. Iterator 的扩展:ListIterator
Iterator
是一个单向迭代器,而 ListIterator
是其增强版,专门用于双向遍历列表。
- 新增方法:
hasPrevious()
和previous()
:支持反向遍历。add(E e)
和set(E e)
:支持添加和修改元素。
示例:
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
ListIterator<String> listIterator = list.listIterator();
while (listIterator.hasNext()) {
System.out.println(listIterator.next());
}
while (listIterator.hasPrevious()) {
System.out.println(listIterator.previous());
}
5. Enumeration 的缺点
- 只能读,不能写,限制了对集合的操作。
- 方法名称冗长(如
hasMoreElements()
),不如Iterator
简洁。 - 无法检测集合的结构性修改,因此更容易导致数据不一致。
总结
Enumeration
是早期集合框架的工具,功能简单,仅支持只读遍历;而 Iterator
是现代集合框架的一部分,支持删除操作,功能更强大。实际开发中,Iterator
更加常用,并且适用于几乎所有集合类。如果需要更灵活的双向遍历,可以使用 ListIterator
。