转载请注明出处: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机制的支持;所以,执行的操作自然要多一些。


 补充:

    1. public static void main(String[] args) throws UnsupportedEncodingException {
    2. List<String> list = new ArrayList<String>();
    3. list.add("abc");
    4. list.add("bbc");
    5. list.add("cbc");
    6. Iterator<String> it = list.iterator();
    7. while(it.hasNext()){
    8. String str = it.next();
    9. System.out.println(str);
    10. if(str.equals("abc")){
    11. list.remove(str);
    12. }
    13. }
    14. }

结果报下面的异常

Exception in thread "main" Java.util.ConcurrentModificationException
    at java.util.AbstractList$Itr.checkForComodification(Unknown Source)
    at java.util.AbstractList$Itr.next(Unknown Source)
    at junit.Test.main(Test.java:23)

public static void main(String[] args) throws UnsupportedEncodingException { 
List<String> list = new ArrayList<String>(); 
list.add("abc"); 
list.add("bbc"); 
list.add("cbc"); 
Iterator<String> it = list.iterator(); 
while(it.hasNext()){ 
String str = it.next(); 
System.out.println(str); 
if(str.equals("abc")){ 
it.remove(); 

}

System.out.println(list.size());
}

java中的集合边遍历边删除是需要使用迭代器中的方法

Java集合--Iterator和Enumeration比较的更多相关文章

  1. java集合-Iterator迭代

    我们常常使用 JDK 提供的迭代接口进行 Java 集合的迭代. Iterator iterator = list.iterator(); while(iterator.hasNext()){ Str ...

  2. Java技术——Iterator和Enumeration的不同

    个函数接口.Iterator除了能读取集合的数据之外,也能对数据进行删除操作.尽管前者还没有被弃用但是已经被后者所代替了,Enumeration已经过时的,之所以没有被弃用是因为它仍被几种从以前版本遗 ...

  3. JAVA集合--Iterator接口

        本文首发于cartoon的博客     转载请注明出处:https://cartoonyu.github.io/cartoon-blog     上一篇文章中我在集合元素的遍历中已经有涉及到I ...

  4. Java集合Iterator迭代器的实现

    一.迭代器概述 1.什么是迭代器? 在Java中,有很多的数据容器,对于这些的操作有很多的共性.Java采用了迭代器来为各种容器提供了公共的操作接口.这样使得对容器的遍历操作与其具体的底层实现相隔离, ...

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

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

  6. Java 集合源码解析(1):Iterator

    Java, Android 开发也有段时间了,当初为了早点学 Android,Java 匆匆了解个大概就结束了,基础不够扎实. 虽然集合框架经常用,但是一直没有仔细看看原理,仅止于会用,不知道为什么要 ...

  7. Java集合详解3:Iterator,fail-fast机制与比较器

    Java集合详解3:Iterator,fail-fast机制与比较器 今天我们来探索一下LIterator,fail-fast机制与比较器的源码. 具体代码在我的GitHub中可以找到 https:/ ...

  8. 牛客网Java刷题知识点之Java 集合框架的构成、集合框架中的迭代器Iterator、集合框架中的集合接口Collection(List和Set)、集合框架中的Map集合

    不多说,直接上干货! 集合框架中包含了大量集合接口.这些接口的实现类和操作它们的算法. 集合容器因为内部的数据结构不同,有多种具体容器. 不断的向上抽取,就形成了集合框架. Map是一次添加一对元素. ...

  9. Java集合详解3:一文读懂Iterator,fail-fast机制与比较器

    <Java集合详解系列>是我在完成夯实Java基础篇的系列博客后准备开始写的新系列. 这些文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查 ...

随机推荐

  1. 读取json数据封装

    前言:做自动化常用公共方法 import json class ReadJson(): def __init__(self): self.data = self.read_data() #读取JSON ...

  2. STL源码剖析-学习笔记

    1.模板是一个公式或是蓝图,本身不是类或是函数,需进行实例化的过程.这个过程是在编译期完成的,编译器根据传递的实参,推断出形参的类型,从而实例化相应的函数 2. 后续补充-.

  3. selenium + python 环境配置 (四)之启动Firefox

    火狐浏览器自身适配selenium   因此不需要再安装 直接代码启动: __author__ = 'admin' #作者 # -*- coding:utf-8 -*- # 建议所有都加编码 from ...

  4. C语言位操作中指定的某一位数置0、置1、取反

    一.指定的某一位数置1 宏 #define setbit(x,y)  x|=(1<<y) 二.指定的某一位数置0 宏  #define clrbit(x,y)  x&=~(1< ...

  5. 【51nod】1634 刚体图

    [51nod]1634 刚体图 给一个左边n个点右边m个点二分图求合法的连通图个数,每条边选了之后会带来价值乘2的贡献 类似城市规划那道题的计数 设\(g[i][j]\)为左边\(i\)个点,右边\( ...

  6. go 结构体定义和结构体指针

    结构体一个结构体(`struct`)就是一个字段的集合. 将来要使用它向java .C# 中的class 有相同的地位 struct 可以用来值传递 同时可以通过引用传递参数(地址) java C# ...

  7. S03_CH09_DMA_4_Video_Switch视频切换系统

    S03_CH09_DMA_4_Video_Switch视频切换系统 9.1概述 本例程详细创建过程和本季课程第一课<S03_CH01_AXI_DMA_LOOP 环路测试>非常类似,因此如果 ...

  8. Luogu5284 十二省联考2019字符串问题(后缀树+拓扑排序)

    对反串建SAM弄出后缀树,每个b串通过倍增定位其在后缀树上对应的节点,根据其长度将节点拆开.然后每个a串也找到对应的节点,由该节点向表示a串的节点连边,再把所给的边连上跑拓扑排序即可. #includ ...

  9. C#对象转换工具类

    using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using Sy ...

  10. 区间dp最长回文子序列问题

    状态转移方程如下: 当i > j时,dp[i,j]= 0. 当i = j时,dp[i,j] = 1. 当i < j并且str[i] == str[j]时,dp[i][j] = dp[i+1 ...