zoukankan      html  css  js  c++  java
  • Java 集合系列18之 Iterator和Enumeration比较

    概要

    这一章,我们对Iterator和Enumeration进行比较学习。内容包括:
    第1部分 Iterator和Enumeration区别
    第2部分 Iterator和Enumeration实例

    转载请注明出处:http://www.cnblogs.com/skywang12345/admin/EditPosts.aspx?postid=3311275

    第1部分 Iterator和Enumeration区别

    在Java集合中,我们通常都通过 “Iterator(迭代器)” 或 “Enumeration(枚举类)” 去遍历集合。今天,我们就一起学习一下它们之间到底有什么区别。

    我们先看看 Enumeration.java 和 Iterator.java的源码,再说它们的区别。

    Enumeration是一个接口,它的源码如下:

    复制代码
    package java.util;
    
    public interface Enumeration<E> {
    
        boolean hasMoreElements();
    
        E nextElement();
    }
    复制代码

    Iterator也是一个接口,它的源码如下:

    复制代码
    package java.util;
    
    public interface Iterator<E> {
        boolean hasNext();
    
        E next();
    
        void remove();
    }
    复制代码

    看完代码了,我们再来说说它们之间的区别。

    (01) 函数接口不同
            Enumeration只有2个函数接口。通过Enumeration,我们只能读取集合的数据,而不能对数据进行修改。
            Iterator只有3个函数接口。Iterator除了能读取集合的数据之外,也能数据进行删除操作。

    (02) Iterator支持fail-fast机制,而Enumeration不支持。
            Enumeration 是JDK 1.0添加的接口。使用到它的函数包括Vector、Hashtable等类,这些类都是JDK 1.0中加入的,Enumeration存在的目的就是为它们提供遍历接口。Enumeration本身并没有支持同步,而在Vector、 Hashtable实现Enumeration时,添加了同步。
            而Iterator 是JDK 1.2才添加的接口,它也是为了HashMap、ArrayList等集合提供遍历接口。Iterator是支持fail-fast机制的:当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。

     

    第2部分 Iterator和Enumeration实例

    下面,我们编写一个Hashtable,然后分别通过 Iterator 和 Enumeration 去遍历它,比较它们的效率。代码如下:

    复制代码
     1 import java.util.Enumeration;
     2 import java.util.Hashtable;
     3 import java.util.Iterator;
     4 import java.util.Map.Entry;
     5 import java.util.Random;
     6 
     7 /*
     8  * 测试分别通过 Iterator 和 Enumeration 去遍历Hashtable
     9  * @author skywang
    10  */
    11 public class IteratorEnumeration {
    12 
    13     public static void main(String[] args) {
    14         int val;
    15         Random r = new Random();
    16         Hashtable table = new Hashtable();
    17         for (int i=0; i<100000; i++) {
    18             // 随机获取一个[0,100)之间的数字
    19             val = r.nextInt(100);
    20             table.put(String.valueOf(i), val);
    21         }
    22 
    23         // 通过Iterator遍历Hashtable
    24         iterateHashtable(table) ;
    25 
    26         // 通过Enumeration遍历Hashtable
    27         enumHashtable(table);
    28     }
    29     
    30     /*
    31      * 通过Iterator遍历Hashtable
    32      */
    33     private static void iterateHashtable(Hashtable table) {
    34         long startTime = System.currentTimeMillis();
    35 
    36         Iterator iter = table.entrySet().iterator();
    37         while(iter.hasNext()) {
    38             //System.out.println("iter:"+iter.next());
    39             iter.next();
    40         }
    41 
    42         long endTime = System.currentTimeMillis();
    43         countTime(startTime, endTime);
    44     }
    45     
    46     /*
    47      * 通过Enumeration遍历Hashtable
    48      */
    49     private static void enumHashtable(Hashtable table) {
    50         long startTime = System.currentTimeMillis();
    51 
    52         Enumeration enu = table.elements();
    53         while(enu.hasMoreElements()) {
    54             //System.out.println("enu:"+enu.nextElement());
    55             enu.nextElement();
    56         }
    57 
    58         long endTime = System.currentTimeMillis();
    59         countTime(startTime, endTime);
    60     }
    61 
    62     private static void countTime(long start, long end) {
    63         System.out.println("time: "+(end-start)+"ms");
    64     }
    65 }
    复制代码

    运行结果如下:

    time: 9ms
    time: 5ms

    从中,我们可以看出。Enumeration 比 Iterator 的遍历速度更快。为什么呢?
    这是因为,Hashtable中Iterator是通过Enumeration去实现的,而且Iterator添加了对fail-fast机制的支持;所以,执行的操作自然要多一些。

  • 相关阅读:
    每日一题 为了工作 2020 0412 第四十一题
    每日一题 为了工作 2020 04011 第四十题
    每日一题 为了工作 2020 0410 第三十九题
    每日一题 为了工作 2020 0409 第三十八题
    每日一题 为了工作 2020 0408 第三十七题
    每日一题 为了工作 2020 0407 第三十六题
    每日一题 为了工作 2020 0406 第三十五题
    每日一题 为了工作 2020 0405 第三十四题
    学习总结(二十四)
    学习总结(二十三)
  • 原文地址:https://www.cnblogs.com/wzyxidian/p/5205011.html
Copyright © 2011-2022 走看看