Java 集合系列18之 Iterator和Enumeration比较

本文比较了Java中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机制的支持;所以,执行的操作自然要多一些。

 


更多内容

Java 集合系列目录

Java 集合系列01之 总体框架

Java 集合系列04之 fail-fast总结(通过ArrayList来说明fail-fast的原理、解决办法)

Java 集合系列10之 HashMap详细介绍(源码解析)和使用示例

Java 集合系列11之 Hashtable详细介绍(源码解析)和使用示例

Java 集合系列12之 TreeMap详细介绍(源码解析)和使用示例

Java 集合系列13之 WeakHashMap详细介绍(源码解析)和使用示例

Java 集合系列14之 Map总结(HashMap, Hashtable, TreeMap, WeakHashMap等使用场景)

Java 集合系列18之 Iterator和Enumeration比较

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值