Java 中 Iterator 和 Enumeration 的区别
Java 中的 java.util.Iterator
和 java.util.Enumeration
均可用来遍历 Java 中的集合框架(list,map,set 等)。
但是两者也有一些区别,主要表现为:
并非所有的 collection 都支持
Enumeration
的遍历,但是都支持Iterator
的遍历。如 Hashtable 支持但是 HashMap 不支持。但是两者都支持Iterator
的遍历。Iterator
提供了remove()
方法可以在遍历的同时删除集合中的元素,但是Enumeration
没有这个方法,对集合中的元素只读两者的方法名不同,具体见下面的代码
/**
* compare Iterator with Enumeration
*/
import java.util.*;
public class HashTableAndHashMap
{
public static void main(String[] args)
{
//init the map
Hashtable<String,String> ht = new Hashtable<String,String>();
Map<String,String> hm = new HashMap<String,String>();
for(int i=0;i<5;i++)
{
.put(Integer.toString(i), Integer.toString(i));
ht.put(Integer.toString(i), Integer.toString(i));
hm}
//different ways of iterating the values
Iterator<Map.Entry<String, String>> it = hm.entrySet().iterator();
System.out.println("traverse hashmap");
while (it.hasNext())
{
String key = it.next().getKey();
String value = hm.get(key);
if (key.equals("2"))
{
.remove();
itSystem.out.println(key+" is removed");
continue;
}
System.out.println(key+":"+value);
}
System.out.println("hashmap final size:"+hm.size()+"\n");
System.out.println("traverse hashtable");
Enumeration<String> em = ht.keys();
while(em.hasMoreElements())
{
String key = em.nextElement();
String value = ht.get(key);
if (key.equals("2"))
{
//em不提供remove的方法,但是可以通过ht.remove(key)删除
System.out.println(key+" is removed");
continue;
}
System.out.println(key+":"+value);
}
}
}
从上面的代码可以看到,两者遍历的方法名不同:
名称 | 是否还有元素 | 找到下一元素 |
---|---|---|
Iterator | hasNext() | next() |
Enumeration | hasMoreElements() | nextElement() |
而且虽然 em 遍历的时候不可以通过自己删除某个元素,但是可以通过 collection 自身删除,见上面的 ht.remove()
, 而通过 Iterator 遍历的时候不可以通过 collection 自身删除,如上面假如用了 hm.remove()
会抛出 ConcurrentModificationException
。