本文介绍一下Iterator和Enumeration的区别及其效率

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

package java.util;

import java.util.function.Consumer;

public interface Iterator<E> {
    //返回迭代器刚越过的元素的引用,返回值是Object,需要强制转换成自己需要的类型
    boolean hasNext();
    //判断容器内是否还有可供访问的元素,返回值是E
    E next();
   //删除迭代器刚越过的元素
    default void remove() {
        throw new UnsupportedOperationException("remove");
    }

    default void forEachRemaining(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        while (hasNext())
            action.accept(next());
    }
}

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

package java.util;

public interface Enumeration<E> {

    boolean hasMoreElements();

    E nextElement();
}

从源码可以看出,Iterator除了能读取集合的数据之外,也能数据进行删除操作;而Enumeration只能读取集合的数据,而不能对数据进行修改。

Iterator支持fail-fast机制,而Enumeration不支持fail-fast机制。Enumeration 是JDK 1.0添加的接口。使用到它的函数包括Vector、Hashtable等类,这些类都是JDK 1.0中加入的。Iterator是JDK1.2添加的接口,Iterator是基于Enumeration实现的,同时Iterator支持fail-fast机制,所以Iterator遍历集合时会比Enumeration遍历集合慢一些。

使用一个Hashtable集合,然后分别通过 Iterator 和 Enumeration 去遍历它,比较它们的效率。代码如下:

package com.xyfer;

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

public class Test {
    public static void main(String[] args) {
        int n;
        Random r = new Random();
        Hashtable t = new Hashtable();
        for (int i = 0; i < 10000; i++) {
            n = r.nextInt(1000);
            t.put(i, n);
        }
        iterateHashtable(t);
        enumeration(t);
    }
    //使用Iterator遍历Hashtable
    private static void iterateHashtable(Hashtable t) {
        long start = System.currentTimeMillis();
        Iterator i = t.entrySet().iterator();
        while (i.hasNext()) {
            Map.Entry entry = (Entry) i.next();
            //System.out.println("key:" + entry.getKey() + "value:" + entry.getValue());
        }
        long end = System.currentTimeMillis();
        useTime(start,end);
    }
    //使用Enumeration遍历Hashtable
    private static void enumeration(Hashtable t) {
        long start = System.currentTimeMillis();
        Enumeration enu = t.elements();
        while (enu.hasMoreElements()) {
            enu.nextElement();
            //Enumeration em = (Enumeration) enu.nextElement();
            //System.out.println(enu.nextElement());
        }
        long end = System.currentTimeMillis();
        useTime(start,end);
    }
    //计算遍历Hashtable所耗时间
    private static void useTime(long start,long end) {
        System.out.println("耗时:"+(end-start)+"ms");
    }

}

控制台打印结果:

Iterator和Enumeration的区别-LMLPHP

从控制打印结果来看,Iterator遍历集合时确实会比Enumeration遍历集合慢一些。

03-08 05:46