• 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遍历集合慢一些。

  • 相关阅读:
    spring-boot 中application.properties的各种配置
    spring-boot 集合mybatis 的分页查询
    spring boot热部署pom.xml配置
    ssm框架整合
    mybatis逆向工程
    整合hibernate的lucene大数据模糊查询
    QBC查询、离线条件查询(DetachedCriteric)和分页查询模版
    虚拟机vmnet0、vmnet1和vmnet8的区别
    centOS7-配置网络地址
    在windows中使用Navicat连接Linux虚拟机中的mysql数据库
  • 原文地址:https://www.cnblogs.com/xyfer1018/p/10493244.html
Copyright © 2020-2023  润新知