Java集合--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机制的支持;所以,执行的操作自然要多一些。
补充:
- 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")){
- list.remove(str);
- }
- }
- }
结果报下面的异常
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比较的更多相关文章
- java集合-Iterator迭代
我们常常使用 JDK 提供的迭代接口进行 Java 集合的迭代. Iterator iterator = list.iterator(); while(iterator.hasNext()){ Str ...
- Java技术——Iterator和Enumeration的不同
个函数接口.Iterator除了能读取集合的数据之外,也能对数据进行删除操作.尽管前者还没有被弃用但是已经被后者所代替了,Enumeration已经过时的,之所以没有被弃用是因为它仍被几种从以前版本遗 ...
- JAVA集合--Iterator接口
本文首发于cartoon的博客 转载请注明出处:https://cartoonyu.github.io/cartoon-blog 上一篇文章中我在集合元素的遍历中已经有涉及到I ...
- Java集合Iterator迭代器的实现
一.迭代器概述 1.什么是迭代器? 在Java中,有很多的数据容器,对于这些的操作有很多的共性.Java采用了迭代器来为各种容器提供了公共的操作接口.这样使得对容器的遍历操作与其具体的底层实现相隔离, ...
- Java 集合系列18之 Iterator和Enumeration比较
概要 这一章,我们对Iterator和Enumeration进行比较学习.内容包括:第1部分 Iterator和Enumeration区别第2部分 Iterator和Enumeration实例 转载请 ...
- Java 集合源码解析(1):Iterator
Java, Android 开发也有段时间了,当初为了早点学 Android,Java 匆匆了解个大概就结束了,基础不够扎实. 虽然集合框架经常用,但是一直没有仔细看看原理,仅止于会用,不知道为什么要 ...
- Java集合详解3:Iterator,fail-fast机制与比较器
Java集合详解3:Iterator,fail-fast机制与比较器 今天我们来探索一下LIterator,fail-fast机制与比较器的源码. 具体代码在我的GitHub中可以找到 https:/ ...
- 牛客网Java刷题知识点之Java 集合框架的构成、集合框架中的迭代器Iterator、集合框架中的集合接口Collection(List和Set)、集合框架中的Map集合
不多说,直接上干货! 集合框架中包含了大量集合接口.这些接口的实现类和操作它们的算法. 集合容器因为内部的数据结构不同,有多种具体容器. 不断的向上抽取,就形成了集合框架. Map是一次添加一对元素. ...
- Java集合详解3:一文读懂Iterator,fail-fast机制与比较器
<Java集合详解系列>是我在完成夯实Java基础篇的系列博客后准备开始写的新系列. 这些文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查 ...
随机推荐
- 网站架构(LNMP)
说明: 1)LNMP架构的组成(作用) 2)LNMP架构的部署 3)LNMP架构通讯原理 4)LNMP服务之间如何建立管理 nginx+php 运维负责 php+mysql 开发负责 5) 运 ...
- [转载]Oracle中动态SQL详解
1.静态SQLSQL与动态SQL Oracle编译PL/SQL程序块分为两个种:其一为前期联编(early binding),即SQL语句在程序编译期间就已经确定,大多数的编译情况属于这种类型:另外一 ...
- GitLab基本使用
一.引言 在微服务架构中,由于我们对系统的划分粒度足够小,服务会很多,而且也存在经常迭代的情况.如果还按照以前的部署方式显得非常吃力和复杂,并且很容易出现错误.而随着容器技术的发展,这个时候持续集成( ...
- RISC-V汇编指南
原文出处:https://github.com/riscv/riscv-asm-manual/blob/master/riscv-asm.md RISC-V Assembly Programmer's ...
- 一个后端开发者的前端语言基础:JavaScript
JavaScript (一) 基本概述 (1) 概述 JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的 ...
- [转帖]Nginx为什么高效?一文搞明白Nginx核心原理
Nginx为什么高效?一文搞明白Nginx核心原理 咔咔侃技术 2019-09-06 15:37:00 https://www.toutiao.com/a6733057587622707724/ Ng ...
- oracle中row_number()的用法
公司系统升级的时候需要数据迁移,遇到一个问题:新表的数据结构和旧表异构,旧表是流水号,新表是联合主键(业务号码+业务号码序号) 最后发现用窗口函数 row_number() + partition b ...
- AtCoder整理(持续更新中……)
做了那么久的atcoder觉得自己的题解发的很乱 给有想和我一起交流atcoder题目(或者指出我做法的很菜)(或者指责我为什么整场比赛只会抄题解)的同学一个索引的机会??? 于是写了个爬虫爬了下 A ...
- spring cloud微服务实践四
spring cloud的hystrix还有一个配搭的库hystrix-dashboard,它是hystrix的一款监控工具,能直观的显示hystrix响应信息,请求成功率等.但是hystrix-da ...
- jira索引失败
""" # 参考:http://www.mamicode.com/info-detail-2369087.html jira断电重启后索引失败, 解决方法: 关闭jira ...