`
youyu4
  • 浏览: 442106 次
社区版块
存档分类
最新评论

java -- Iterator和Enumeration比较

 
阅读更多

java -- Iterator和Enumeration比较

 

 

区别在哪

 

      在Java集合中,我们通常都通过 “Iterator(迭代器)” 或 “Enumeration(枚举类)” 去遍历集合。先看看下面源码:

 

Enumeration是一个接口,它的源码如下:

package java.util;

public interface Enumeration<E> {

    boolean hasMoreElements();

    E nextElement();
}

 

 

Iterator也是一个接口,它的源码如下:

package java.util;

public interface Iterator<E> {
    boolean hasNext();

    E next();

    void remove();
}

 

 

从上面源码,我们就能看出区别

 

函数接口不同

 

  • Enumeration只有2个函数接口。通过Enumeration,我们只能读取集合的数据,而不能对数据进行修改。
  • Iterator只有3个函数接口。Iterator除了能读取集合的数据之外,也能数据进行删除操作。

 

 

Iterator支持fail-fast机制,而Enumeration不支持。

 

  • Enumeration 是JDK 1.0添加的接口。使用到它的函数包括Vector、Hashtable等类,这些类都是JDK 1.0中加入的,Enumeration存在的目的就是为它们提供遍历接口。Enumeration本身并没有支持同步,而在Vector、Hashtable实现Enumeration时,添加了同步。
  • Iterator 是JDK 1.2才添加的接口,它也是为了HashMap、ArrayList等集合提供遍历接口。Iterator是支持fail-fast机制的:当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。

 

 

 

Iterator和Enumeration实例

 

      下面,我们编写一个Hashtable,然后分别通过 Iterator 和 Enumeration 去遍历它,比较它们的效率。代码如下:

 

import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Random;

/*
 * 测试分别通过 Iterator 和 Enumeration 去遍历Hashtable
 * @author skywang
 */
public class IteratorEnumeration {

    public static void main(String[] args) {
        int val;
        Random r = new Random();
        Hashtable table = new Hashtable();
        for (int i=0; i<100000; i++) {
            // 随机获取一个[0,100)之间的数字
            val = r.nextInt(100);
            table.put(String.valueOf(i), val);
        }

        // 通过Iterator遍历Hashtable
        iterateHashtable(table) ;

        // 通过Enumeration遍历Hashtable
        enumHashtable(table);
    }
    
    /*
     * 通过Iterator遍历Hashtable
     */
    private static void iterateHashtable(Hashtable table) {
        long startTime = System.currentTimeMillis();

        Iterator iter = table.entrySet().iterator();
        while(iter.hasNext()) {
            //System.out.println("iter:"+iter.next());
            iter.next();
        }

        long endTime = System.currentTimeMillis();
        countTime(startTime, endTime);
    }
    
    /*
     * 通过Enumeration遍历Hashtable
     */
    private static void enumHashtable(Hashtable table) {
        long startTime = System.currentTimeMillis();

        Enumeration enu = table.elements();
        while(enu.hasMoreElements()) {
            //System.out.println("enu:"+enu.nextElement());
            enu.nextElement();
        }

        long endTime = System.currentTimeMillis();
        countTime(startTime, endTime);
    }

    private static void countTime(long start, long end) {
        System.out.println("time: "+(end-start)+"ms");
    }
}

 

运行结果如下:

time: 9ms

time: 5ms

 

从中,我们可以看出。Enumeration 比 Iterator 的遍历速度更快。

 

 

为什么呢?

 

      这是因为,Hashtable中Iterator是通过Enumeration去实现的,而且Iterator添加了对fail-fast机制的支持;所以,执行的操作自然要多一些。

分享到:
评论

相关推荐

    java-util包资料

    - **Enumeration**:在早期的Java版本中用于遍历集合,已逐渐被Iterator取代。 3. **日期和时间API**: - **Date**: 表示特定瞬间,可以精确到毫秒。 - **Calendar**: 日历类,提供处理日期和时间的高级功能。 ...

    Java 实例 - 使用 Enumeration 遍历 HashTable源代码+详细指导教程.zip

    `Enumeration`在Java早期版本中用于迭代容器中的元素,虽然在Java集合框架的后续版本中被迭代器(Iterator)所取代,但在处理`HashTable`时,`Enumeration`仍然是首选工具。 `HashTable`的主要特点包括线程安全(即...

    详解Java中的迭代迭代器Iterator与枚举器Enumeration

    Java中的迭代器(Iterator)与枚举器(Enumeration)是两种用于遍历集合(Collection)的接口。在Java集合框架中,集合提供了多种数据结构存储对象,而迭代器与枚举器提供了访问这些集合中元素的方法。尽管它们的...

    JAVA--基础知识[归纳].pdf

    此外,`Iterator`接口用于遍历集合中的元素,` Enumeration`接口在老版本的Java中用于遍历`Vector`和`Hashtable`。 异常类如`EmptyStackException`、`NoSuchElementException`和`TooManyListenersException`是处理...

    详谈Enumeration接口和Iterator接口的区别

    在Java编程语言中,`Enumeration`接口和`Iterator`接口都是用于遍历集合对象的工具,但它们之间存在显著的差异。下面是关于这两个接口详细的区别分析: 1. **函数接口不同** `Enumeration`接口提供了两个方法: -...

    java Iterator接口和LIstIterator接口分析

    它取代了Java集合框架中的Enumeration接口,提供了更加灵活和强大的迭代方式。Iterator接口定义了三个方法:hasNext()、next()和remove()。 * hasNext()方法:返回一个布尔值,表示迭代是否还有更多元素。 * next()...

    java 面试 百度入职老哥整理 全是干货

    - Java集合框架中的迭代器(Iterator)和枚举器(Enumeration)。 - Java中的并发工具类,如ConcurrentHashMap、PriorityQueue等。 - Java中关于锁的机制,包括重入锁、对象锁、类锁等概念。 4. 面向对象编程 -...

    使用Enumeration和Iterator遍历集合类详解

    为了方便地访问和操作集合中的元素,Java提供了两种主要的遍历机制:`Enumeration` 和 `Iterator`。尽管 `Iterator` 在功能上比 `Enumeration` 更强大,但 `Enumeration` 仍然在某些特定场景下被使用。接下来,我们...

    大学课程讲义-Java基础-Java集合.pptx

    Iterator 接口是 Java 集合框架中用于遍历集合元素的接口,提供了 hasNext() 和 next() 两个方法,用于遍历集合中的元素。使用 Iterator 接口可以隐藏集合实现类的底层细节,提供统一的遍历集合元素的编程接口。 ...

    Java集合面试问题

    Java集合框架是Java平台的核心组件之一,它为开发者提供了多种数据结构来存储和操作对象集合。Java集合主要包括两大接口:`Collection` 和 `Map`。 #### Collection接口: - **特点**:它代表一个元素列表,可以...

    JAVA基础-集合类

    - **Iterator迭代器**:所有Collection集合都支持迭代器,它是遍历集合的标准方式。 - **增强for循环**:也称为foreach循环,简化了迭代过程,适用于所有实现了Iterable接口的集合。 - **Enumeration**:仅适用于...

    java程序设计(第二版)课后习题答案

    * Iterator 和 Enumeration 接口 六、 Java 多线程编程 * 多线程编程的概念和优点 * Thread 类和 Runnable 接口 * 线程的生命周期和同步机制 * deadlock 和 starvation 问题 七、 Java 网络编程 * Socket 编程:...

    java-collection-example

    Java集合框架是Java编程语言中的一个核心特性,它为数据存储和操作提供了强大的支持。"java-collection-example"项目旨在展示如何使用Java Collections库的各种组件,包括接口、类和算法。这个库使得开发者能够高效...

    Java期末复习-类集框架

    - `Comparable`接口用于实现对象的自然排序,`equals()`和`hashCode()`方法用于比较和哈希存储,是确保集合中元素唯一性的重要方法。 在使用类集框架时,泛型的使用能提高类型安全性,避免类型转换异常。同时,...

    java.util源码-java-util:javautil源代码

    4. **迭代器和枚举**:`Iterator`接口用于遍历集合,而`Enumeration`接口在较旧的API中用于迭代,如Vector和Hashtable。 5. **泛型**:`java.util`包中的大多数类都支持泛型,允许在编译时检查类型安全,减少类型...

    Java面经.适用于校招

    - Iterator和Enumeration都是用于遍历集合的方法。 2.14 LIST、ArrayList、LinkedList和Vector的区别和实现原理 - List接口提供了有序集合的操作。 - ArrayList基于动态数组实现,适合随机访问。 - LinkedList基于...

    Java 实例 - 遍历 HashTable 的键值源代码+详细教程.zip

    遍历`HashTable`通常有两种方法:一种是通过` Enumeration`接口,另一种是使用Java 5及以上版本引入的`Iterator`接口。 1. **使用`Enumeration`遍历**: `HashTable`提供两个方法,`keys()`返回键的枚举对象,`...

    30个Java经典的集合面试题!.pdf

    Java集合框架是Java编程语言中不可或缺的一部分,它提供了一组高效、灵活的数据结构,用于存储和操作对象。Java集合框架自Java 1.2引入以来,已经成为开发人员处理数据的核心工具。以下是一些关于Java集合框架及其...

Global site tag (gtag.js) - Google Analytics