Enumeration接口和Iterator接口的区别有哪些?

答案

枚举速度快,占用内存少,但是不是快速失败的,线程不安全。迭代允许删除底层数据,枚举不行

Enumeration速度是Iterator的2倍???

今天看到这句话,想实验一下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
*/
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Random;

/*
* 测试分别通过 Iterator 和 Enumeration 去遍历Hashtable
* @author skywang
*/
public class IteratorEnumeration {

public static void main(String[] args) {
int val;
Random r = new Random();
Hashtable table = new Hashtable();
for (int i=0; i<10000000; i++) {
// 随机获取一个[0,100)之间的数字
val = r.nextInt(100);
table.put(String.valueOf(i), val);
}

// 通过Iterator遍历Hashtable
iterateHashtable(table) ;

// 通过Enumeration遍历Hashtable
enumHashtable(table);
}

/*
* 通过Iterator遍历Hashtable
*/
private static void iterateHashtable(Hashtable table) {
long startTime = System.currentTimeMillis();

Iterator iter = table.entrySet().iterator();
while(iter.hasNext()) {
//System.out.println("iter:"+iter.next());
iter.next();
}

long endTime = System.currentTimeMillis();
System.out.println("timeIterator: "+(endTime-startTime)+"ms");
}

/*
* 通过Enumeration遍历Hashtable
*/
private static void enumHashtable(Hashtable table) {
long startTime = System.currentTimeMillis();

Enumeration enu = table.elements();
while(enu.hasMoreElements()) {
//System.out.println("enu:"+enu.nextElement());
enu.nextElement();
}

long endTime = System.currentTimeMillis();
System.out.println("timeEnum: "+(endTime-startTime)+"ms");
}


}

当测试1万个数时。结果为timeIterator: 6ms timeEnum: 3ms

当测试10万个数时,结果为timeIterator: 12ms timeEnum: 7ms

当测试100万个数时,结果为timeIterator: 21ms timeEnum: 17ms

当测试1000万个数时,结果为 timeIterator: 142ms timeEnum: 138ms

结论:其实好像差不多啊,但是可以肯定的是Enumeration 比 Iterator 的遍历速度更快。为什么呢? 这是因为,Hashtable中Iterator是通过Enumeration去实现的,而且Iterator添加了对fail-fast机制的支持;所以,执行的操作自然要多一些。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Iterator methods

public boolean hasNext() {

return hasMoreElements();
}

public boolean hasMoreElements() {

Entry<?,?> e = entry;

int i = index;
Entry<?,?>[] t = table;
/* Use locals for faster loop iteration */
while (e == null && i > 0) {
e = t[--i];
}
entry = e;
index = i;
return e != null;
}

占用内存???

这是为什么呢???

-------------本文结束感谢您的阅读-------------