本文介绍一下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遍历集合慢一些。