zoukankan      html  css  js  c++  java
  • 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遍历集合慢一些。

  • 相关阅读:
    鱼眼相机畸变矫正资料
    异常值检测算法三:3sigma模型
    五:瑞芯微RV1109
    四:海思Hi3516CV500/Hi3516DV300
    三:瑞芯微OK3399-C开发板
    二:飞凌嵌入式FCU1201
    一:芯片概述
    六:大数据架构
    五:大数据架构回顾-LambdaPlus架构
    四:大数据架构回顾-IOTA架构
  • 原文地址:https://www.cnblogs.com/xyfer1018/p/10493244.html
Copyright © 2011-2022 走看看