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());
        }
复制代码

 

posted @   aspirant  阅读(1132)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2018-04-24 主键就是聚集索引吗?
2018-04-24 索引-数据库 索引创建默认是非聚集索引
2014-04-24 nfs server的配置 Starting NFS daemon: [FAILED]
点击右上角即可分享
微信分享提示