面试题:Enumeration接口和Iterator接口的区别有哪些?

Enumeration 和 Iterator 都是 Java 中用于遍历集合元素的接口,但它们的设计目的、功能和用法有所不同。以下是它们的主要区别:


1. 引入时间:

  • Enumeration
    • 是 Java 1.0 引入的接口,属于早期的集合遍历方式。
    • 主要用于遍历 Vector 和 Hashtable 等旧版集合类。
  • Iterator
    • 是 Java 1.2 引入的接口,属于 Java 集合框架(Java Collections Framework)的一部分。
    • 用于遍历 ListSet 和 Map 等集合类。

2. 功能对比:

功能EnumerationIterator
遍历方向只能向前遍历(单向)只能向前遍历(单向)
删除元素不支持支持(通过 remove 方法)
方法数量2 个方法:hasMoreElements() 和 nextElement()3 个方法:hasNext()next() 和 remove()
并发修改支持不支持支持快速失败(fail-fast)机制

3. 方法详解:

Enumeration 接口:

  • boolean hasMoreElements()
    • 判断是否还有更多元素。
  • E nextElement()
    • 返回下一个元素。

示例:

Vector<String> vector = new Vector<>();
vector.add("Apple");
vector.add("Banana");

Enumeration<String> enumeration = vector.elements();
while (enumeration.hasMoreElements()) {
    System.out.println(enumeration.nextElement());
}

Iterator 接口:

  • boolean hasNext()
    • 判断是否还有更多元素。
  • E next()
    • 返回下一个元素。
  • void remove()
    • 删除当前元素(可选操作)。

示例:

List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");

Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    String element = iterator.next();
    System.out.println(element);
    if (element.equals("Banana")) {
        iterator.remove(); // 删除元素
    }
}

4. 并发修改支持:

  • Enumeration
    • 不支持检测并发修改。
    • 如果在遍历过程中集合被修改,可能会导致不确定的行为。
  • Iterator
    • 支持快速失败(fail-fast)机制。
    • 如果在遍历过程中集合被修改(除了通过 Iterator 的 remove 方法),会抛出 ConcurrentModificationException 异常。

5. 使用场景:

  • Enumeration
    • 适用于旧版集合类(如 Vector 和 Hashtable)。
    • 适用于不需要删除元素或检测并发修改的场景。
  • Iterator
    • 适用于 Java 集合框架中的所有集合类。
    • 适用于需要删除元素或检测并发修改的场景。

6. 总结对比:

特性EnumerationIterator
引入时间Java 1.0Java 1.2
遍历方向单向单向
删除元素不支持支持
并发修改支持不支持支持(fail-fast 机制)
适用集合VectorHashtable 等旧版集合ListSetMap 等集合框架

7. 代码示例对比:

使用 Enumeration

Vector<String> vector = new Vector<>();
vector.add("Apple");
vector.add("Banana");

Enumeration<String> enumeration = vector.elements();
while (enumeration.hasMoreElements()) {
    System.out.println(enumeration.nextElement());
}

使用 Iterator

List<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");

Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    String element = iterator.next();
    System.out.println(element);
    if (element.equals("Banana")) {
        iterator.remove(); // 删除元素
    }
}

8. 选择依据:

  • 如果需要遍历旧版集合类(如 Vector 或 Hashtable),可以使用 Enumeration
  • 如果需要遍历 Java 集合框架中的集合类,并支持删除元素或检测并发修改,应使用 Iterator

通过理解 Enumeration 和 Iterator 的区别,可以更好地选择适合的遍历方式来处理集合元素。

THE END
点赞11 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容