Iterator和Enumeration的区别
程序员文章站
2022-09-27 18:50:15
本文介绍一下Iterator和Enumeration的区别及其效率 Iterator是一个接口,它的源码如下: Enumeration也是一个接口,它的源码如下: 从源码可以看出,Iterator除了能读取集合的数据之外,也能数据进行删除操作;而Enumeration只能读取集合的数据,而不能对数据 ......
本文介绍一下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遍历集合慢一些。
推荐阅读