当前位置: 移动技术网 > IT编程>开发语言>Java > Iterator和Enumeration的区别

Iterator和Enumeration的区别

2019年03月08日  | 移动技术网IT编程  | 我要评论

本文介绍一下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遍历集合慢一些。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网