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());
            }
  • 相关阅读:
    分布式哈希和一致性哈希算法
    消息队列rabbitmq的五种工作模式(go语言版本)
    Mysql查询缓存
    数据库的三大设计范式
    二叉树的常见算法
    消息队列选型分析
    Mysql防止索引失效原则
    Mysql索引优化单表、两表、三表实践
    数据结构 【栈与队列】
    谷歌实用插件
  • 原文地址:https://www.cnblogs.com/aspirant/p/10763289.html
Copyright © 2011-2022 走看看