分析Enumeration接口和Iterator接口的区别。
首先我们从API文档分析Enumeration接口:
java.util
接口 Enumeration<E>
-
所有已知子接口:
- NamingEnumeration<T>
-
所有已知实现类:
- StringTokenizer
public interface Enumeration<E>
实现 Enumeration 接口的对象,它生成一系列元素,一次生成一个。连续调用 nextElement
方法将返回一系列的连续元素。
例如,要输出向量 v 的所有元素,可使用以下方法:
for (Enumeration e = v.elements() ; e.hasMoreElements() ;) { System.out.println(e.nextElement()); }
这些方法主要通过向量的元素、哈希表的键以及哈希表中的值进行枚举。枚举也用于将输入流指定到 SequenceInputStream
中。
注:此接口的功能与 Iterator 接口的功能是重复的。此外,Iterator 接口添加了一个可选的移除操作,并使用较短的方法名。新的实现应该优先考虑使用 Iterator 接口而不是 Enumeration 接口。
方法摘要 | |
---|---|
boolean | hasMoreElements() 测试此枚举是否包含更多的元素。 |
E | nextElement() 如果此枚举对象至少还有一个可提供的元素,则返回此枚举的下一个元素。 |
从API文档可以看出,Enumeration接口提供两个实现该接口的方法。
再看IteratorAPI文档中的描述:
java.util
接口 Iterator<E>
-
所有已知子接口:
- ListIterator<E>
-
所有已知实现类:
- BeanContextSupport.BCSIterator, Scanner
public interface Iterator<E>
对集合进行迭代的迭代器。迭代器代替了 Java Collections Framework 中的 Enumeration。迭代器与枚举有两点不同:
- 迭代器允许调用方利用定义良好的语义在迭代期间从迭代器所指向的集合移除元素。
- 方法名称得到了改进。
此接口是 Java Collections Framework 的成员。
方法摘要 | |
---|---|
boolean | hasNext() 如果仍有元素可以迭代,则返回 true。 |
E | next() 返回迭代的下一个元素。 |
void | remove() 从迭代器指向的集合中移除迭代器返回的最后一个元素(可选操作)。 |
可以从API文档中看出,Iterator比Enumeration多提供了一个方法(remove()),迭代器代替了 Java Collections Framework 中的 Enumeration。
注:Enumeration速度是Iterator的2倍,同时占用更少的内存。但是,Iterator远远比Enumeration安全,因为其他线程不能够修改正在被iterator遍历的集合里面的对象。同时,Iterator允许调用者删除底层集合里面的元素,这对Enumeration来说是不可能的。
Enumeration和Iterator的主要区别 (1)java中的集合类都提供了返回Iterator的方法,就是迭代器,它和Enumeration(枚举)的主要区别其实就是Iterator可以删除元素,但是Enumration却不能。 (2)还有一点要注意的就是,使 用Iterator来遍历集合时,应使用Iterator的remove()方法来删除集合中的元素,使用集合的remove()方法将抛出ConcurrentModificationException异常。 (3)Enumeration 接口的功能与 Iterator 接口的功能是重复的。此外,Iterator 接口添加了一个可选的移除操作,并使用较短的方法名。新的实现应该优先考虑使用 Iterator 接口而不是Enumeration 接口。