zoukankan      html  css  js  c++  java
  • Iterator和Enumeration的区别

    从源码可以看出,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 去遍历它,比较它们的效率。代码如下:

    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();
    }

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

    注意Hashtable的 

    (1) table.keys,table.elements 都是 Enumeration迭代器使用的

    (2) table.keySet(),table.values,table.entry 都是Iterator的迭代器使用的:

            Hashtable<String,Integer> table=new Hashtable<>();
            for(int i=0;i<100;i++){
                table.put(String.valueOf(i),i);
            }
    
            //1 Enumeration:
            int index=0;
            Enumeration<String> en =table.keys();
            while(en.hasMoreElements()){
    
    
               String key= en.nextElement();
    
               System.out.println("index="+(index++)+"key="+key+" value="+table.get(key));
            }
    
            index=0;
    
            //2
            Enumeration<Integer> en2=table.elements();
    
            while(en2.hasMoreElements()){
    
               Integer value= en2.nextElement();
    
                System.out.println("2=index="+(index++)+" value="+value);
            }
    
            //3 Iterator
    
            index=0;
    
            Iterator<String> it=table.keySet().iterator();
            while(it.hasNext()){
    
                String key= it.next();
    
                System.out.println("3=index="+(index++)+"key="+key+" value="+table.get(key));
            }
    
            // 4 Iterator
            index=0;
    
            Iterator<Integer> it4=table.values().iterator();
            while(it4.hasNext()){
    
                Integer value=it4.next();
    
                System.out.println("4=index="+(index++)+" value="+value);
            }
    
    
            // 5 Iterator
            index=0;
    
            Iterator<Map.Entry<String,Integer>> it5=table.entrySet().iterator();
            while(it5.hasNext()){
    
                Map.Entry<String,Integer> entry=it5.next();
    
                System.out.println("5=index="+(index++)+" key"+entry.getKey()+" value="+entry.getValue());
            }
  • 相关阅读:
    设计模式之里氏替换原则
    设计模式之依赖倒置原则讲解
    条款10 若不想使用编译器自动生成的函数,就该明确拒绝
    Django---常用字段和参数
    Python中abc
    Python中鸭子类型
    Python多继承的正确打开方式:mixins机制
    python新式类和经典类的区别
    Django---drf权限、频率、过滤、排序、异常处理
    删库跑路技巧 删库跑路命令
  • 原文地址:https://www.cnblogs.com/aspirant/p/10763289.html
Copyright © 2011-2022 走看看