Iterator和Enumeration的区别
2019-03-10 11:54:09来源:博客园 阅读 ()
本文介绍一下Iterator和Enumeration的区别及其效率
Iterator是一个接口,它的源码如下:
package java.util; import java.util.function.Consumer; public interface Iterator<E> { //返回迭代器刚越过的元素的引用,返回值是Object,需要强制转换成自己需要的类型 boolean hasNext(); //判断容器内是否还有可供访问的元素,返回值是E E next(); //删除迭代器刚越过的元素 default void remove() { throw new UnsupportedOperationException("remove"); } default void forEachRemaining(Consumer<? super E> action) { Objects.requireNonNull(action); while (hasNext()) action.accept(next()); } }
Enumeration也是一个接口,它的源码如下:
package java.util; public interface Enumeration<E> { boolean hasMoreElements(); E nextElement(); }
从源码可以看出,Iterator除了能读取集合的数据之外,也能数据进行删除操作;而Enumeration只能读取集合的数据,而不能对数据进行修改。
Iterator支持fail-fast机制,而Enumeration不支持fail-fast机制。Enumeration 是JDK 1.0添加的接口。使用到它的函数包括Vector、Hashtable等类,这些类都是JDK 1.0中加入的。Iterator是JDK1.2添加的接口,Iterator是基于Enumeration实现的,同时Iterator支持fail-fast机制,所以Iterator遍历集合时会比Enumeration遍历集合慢一些。
使用一个Hashtable集合,然后分别通过 Iterator 和 Enumeration 去遍历它,比较它们的效率。代码如下:
package com.xyfer; import java.util.Enumeration; import java.util.Hashtable; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.Random; public class Test { public static void main(String[] args) { int n; Random r = new Random(); Hashtable t = new Hashtable(); for (int i = 0; i < 10000; i++) { n = r.nextInt(1000); t.put(i, n); } iterateHashtable(t); enumeration(t); } //使用Iterator遍历Hashtable private static void iterateHashtable(Hashtable t) { long start = System.currentTimeMillis(); Iterator i = t.entrySet().iterator(); while (i.hasNext()) { Map.Entry entry = (Entry) i.next(); //System.out.println("key:" + entry.getKey() + "value:" + entry.getValue()); } long end = System.currentTimeMillis(); useTime(start,end); } //使用Enumeration遍历Hashtable private static void enumeration(Hashtable t) { long start = System.currentTimeMillis(); Enumeration enu = t.elements(); while (enu.hasMoreElements()) { enu.nextElement(); //Enumeration em = (Enumeration) enu.nextElement(); //System.out.println(enu.nextElement()); } long end = System.currentTimeMillis(); useTime(start,end); } //计算遍历Hashtable所耗时间 private static void useTime(long start,long end) { System.out.println("耗时:"+(end-start)+"ms"); } }
控制台打印结果:
从控制打印结果来看,Iterator遍历集合时确实会比Enumeration遍历集合慢一些。
原文链接:https://www.cnblogs.com/xyfer1018/p/10493244.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- System.out.println()和System.out.print()区别 2020-06-10
- ArrayList是如何实现的,ArrayList和LinedList的区别?Array 2020-05-19
- java基础面试题1 2020-05-19
- throws和throw的区别 2020-05-13
- 面试被问ReentrantLock的公平锁与非公平锁,区别以及实现 2020-05-12
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash