8.9 烦琐的接口Enumeration

8.9 烦琐的接口Enumeration

Enumeration接口是Iterator迭代器的”古老版本”,从JDK1.0开始,Enumeration接口就已经存在了(IteratorJDK1.2才出现)。Enumeration接口只有两个名字很长的方法。

Enumeration接口方法

方法 描述
boolean hasMoreElements() 如果此迭代器还有剩下的元素,则返回true
Object nextElement() 返回该迭代器的下一个元素,如果还有的话(否则抛出异常)。

通过这两个方法不难发现,Enumeration接口中的方法名称冗长,难以记忆,而且没有提供Iteratorremove方法。如果现在编写Java程序,应该尽量采用Iterator迭代器,而不是用Enumeration迭代器

尽量采用Iterator 不推荐使用Enumeration

Java之所以保留Enumeration接口,主要是为了照顾以前那些”古老”的程序,那些程序里大量使用了Enumeration接口,如果新版本的Java里直接删除Enumeration接口,将会导致那些程序全部出错。在计算机行业有一条规则:加入任何规则都必须慎之又慎,因为以后无法删除规则。

实际上,前面介绍的Vector(包括其子类Stack)Hashtable两个集合类,以及另一个极少使用的Bitset,都是从JDK1.0遗留下来的集合类,而Enumeration接口可用于遍历这些”古老”的集合类。

而对于ArrayListHashMap等集合类,已经不支持Enumeration迭代器了。

Enumeration迭代Vector和Hashtable

下面程序示范了如何通过Enumeration接口来迭代VectorHashtable

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
import java.util.*;

public class EnumerationTest
{
public static void main(String[] args)
{
Vector vector = new Vector();
vector.add("疯狂Java讲义");
vector.add("轻量级Java EE企业应用实战");
Hashtable scores = new Hashtable();
scores.put("语文" , 78);
scores.put("数学" , 88);

Enumeration em = vector.elements();
while (em.hasMoreElements())
{
System.out.println(em.nextElement());
}
Enumeration keyEm = scores.keys();
while (keyEm.hasMoreElements())
{
Object key = keyEm.nextElement();
System.out.println(key + "--->"
+ scores.get(key));
}
}
}

运行结果:

1
2
3
4
疯狂Java讲义
轻量级Java EE企业应用实战
语文--->78
数学--->88

上面程序使用Enumeration迭代器来遍历VectorHashtable集合里的元素,其工作方式与Iterator迭代器的工作方式基本相似。但使用Enumeration迭代器时方法名更加冗长。

而且,Enumeration迭代器只能遍历VectorHashtable这种古老的集合,因此通常不要使用它。除非在某些极端情况下,不得不使用Enumeration,否则都应该选择Iterator迭代器