答案
枚举速度快,占用内存少,但是不是快速失败的,线程不安全。迭代允许删除底层数据,枚举不行
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 | // Iterator methods |
占用内存???
这是为什么呢???