转载请注明出处: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. 第一周006------Java 三大版本含义——Java ME和安卓开发的关系

    Java ME 和安卓开发没有任何关系 Java  SE(Java Standard Edition):标准版,定位在个人计算机的应用(桌面系统 QQ  游戏)Java  EE(Java Enterp ...

  2. 从MongoDB及mysql 谈B/B+树

    一 B树的由来 B树指的是一类树,包括B-树,B+树,B*树等,是一种自平衡的搜索树,它类似普通的平衡二叉树,不同的一点是B树允许每个节点有更多的子节点.B树是专门为外部存储器设计的,如磁盘,它对于读 ...

  3. python学习-21 集合 2

    集合的其他方法 1.交差补集 math = {'xm','xh','xg','xx'} english ={'xm','xh','dm','john'} print(math.symmetric_di ...

  4. odoo——日历的一对多与多对一

    # model文件 # -*- coding: utf-8 -*- from odoo import api, fields, models class TodoTestYear(models.Mod ...

  5. 并不对劲的THUWC2020

    day -inf 因为一些(不是寒假时长锐减的)小原因,今年(2020)THUWC在去年(2019)就举办了! 这导致某个小弱智只能临阵磨枪了QAQ- day 1 早: 没有看到吕爷,签到.试机. 签 ...

  6. 学界 | 华为诺亚方舟实验室提出新型元学习法 Meta-SGD ,在回归与分类任务中表现超群

    学界 | 华为诺亚方舟实验室提出新型元学习法 Meta-SGD ,在回归与分类任务中表现超群 机器之心发表于机器之心订阅 499 广告关闭 11.11 智慧上云 云服务器企业新用户优先购,享双11同等 ...

  7. MySql数据库 优化

    MySQL数据库优化方案 Mysql的优化,大体可以分为三部分:索引的优化,sql慢查询的优化,表的优化. 开启慢查询日志,可以让MySQL记录下查询超过指定时间的语句,通过定位分析性能的瓶颈,才能更 ...

  8. DP动态规划学习笔记——高级篇上

    说了要肝的怎么能咕咕咕呢? 不了解DP或者想从基础开始学习DP的请移步上一篇博客:DP动态规划学习笔记 这一篇博客我们将分为上中下三篇(这样就不用咕咕咕了...),上篇是较难一些树形DP,中篇则是数位 ...

  9. (五)CXF之添加拦截器

    一.需求分析 webService中的拦截器类似于servlet的Filter过滤器.一般用于调用服务前后先调用拦截器的方法. 二.案例 本章案例是基于上一章节的基础上添加拦截器的 2.1 服务端添加 ...

  10. 二、eureka服务端注册服务

    所有文章 https://www.cnblogs.com/lay2017/p/11908715.html 正文 入口 上文我们说到,eureka是使用jersey来对外提供restful风格的rpc调 ...