Java 中 Iterator 和 Enumeration 的区别

Java 中的 java.util.Iteratorjava.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++)  
        {  
            ht.put(Integer.toString(i), Integer.toString(i));  
            hm.put(Integer.toString(i), Integer.toString(i));  
        }

        //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"))  
            {  
                it.remove();  
                System.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);  
        }  
    }  
}  

从上面的代码可以看到,两者遍历的方法名不同:

名称是否还有元素找到下一元素
IteratorhasNext()next()
EnumerationhasMoreElements()nextElement()

而且虽然 em 遍历的时候不可以通过自己删除某个元素,但是可以通过 collection 自身删除,见上面的 ht.remove(), 而通过 Iterator 遍历的时候不可以通过 collection 自身删除,如上面假如用了 hm.remove() 会抛出 ConcurrentModificationException