欢迎来到Introzo百科
Introzo百科
当前位置:网站首页 > 技术 > Java集合中迭代器和枚举的比较系列十八

Java集合中迭代器和枚举的比较系列十八

日期:2023-10-07 11:24

总结

这一章我们比较研究Iterator和Enumeration。内容包括:
第1部分迭代器和枚举的区别
第2部分迭代器和枚举示例

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

第1部分 迭代器和枚举的区别

在Java集合中,我们通常通过“迭代器”或“枚举”来遍历集合。今天我们就一起来了解一下它们之间有哪些区别。

我们先看一下www.introzo.com和www.introzo.com的源码,然后说说他们的区别。

枚举是一个接口,其源码如下:

java.util;

公共 接口枚举 {

    boolean hasMoreElements();

    E nextElement();
}

迭代器也是一个接口。其源码如下:

java.util;

公共 接口迭代器 {
    boolean hasNext();

    E 下一个();

    void 删除();
}

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

(01)函数接口不同
枚举只有2个函数接口。 通过枚举,我们只能读取集合的数据,而不能修改数据。
迭代器只有3个函数接口。 迭代器不仅可以读取集合的数据,还可以删除数据。

(02) 迭代器支持快速失败机制,而枚举则不支持。
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 部分迭代器和枚举示例

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

 1 导入 java.util.Enumeration;
 2 导入 java.util.Hashtable;
 3 导入 java.util.Iterator; 4 导入 java.util.Map.Entry;
 5 导入 java.util.Random;
 6
 7 /*
 8  * 测试分别通过Iterator和Enumeration遍历Hashtable
 9  * @author skywang
10 */
11公共迭代器枚举{
12
13 public 静态 void main(String[] args) {
14 intval;
15随机 r = 随机();
16 哈希表 = 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 // 通过迭代器遍历 Hashtable
24  iterateHashtable(table);
25
26 // 通过枚举遍历哈希表27  enumHashtable(table);
28  }
29
30/*
31  * 通过Iterator遍历Hashtable
32 */
33 private 静态 void iterateHashtable(哈希表){
34 long startTime = System.currentTimeMillis();
35
36 迭代器 iter = table.entrySet().iterator();
37 while(iter.hasNext()) {
38 //System.out.println("iter:"+www.introzo.com());
39  www.introzo.com();
40  }
41
42 long endTime = System.currentTimeMillis();
43  countTime(开始时间, 结束时间);
44  }
45
46/*
47  * 通过Enumeration遍历Hashtable
48 */
49 private 静态 void enumHashtable(哈希表){50 long startTime = System.currentTimeMillis();
51
52 枚举 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(开始时间, 结束时间);
60  }
61
62 私有 静态 void countTime() 长开始,结束){
63 System.out.println("时间:"+(结束-开始)+"ms");
64  }
65 }
查看代码

运行结果如下:

时间:9ms
时间: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集合系列十八:迭代器与枚举的比较

关灯