欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Iterator和Enumeration的区别

程序员文章站 2022-03-20 09:39:32
本文介绍一下Iterator和Enumeration的区别及其效率 Iterator是一个接口,它的源码如下: Enumeration也是一个接口,它的源码如下: 从源码可以看出,Iterator除了能读取集合的数据之外,也能数据进行删除操作;而Enumeration只能读取集合的数据,而不能对数据 ......

本文介绍一下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的区别

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