前言
在數據庫連接池分析的代碼實例中,看到其中使用Enumeration來遍歷Vector集合。后來就找了一些資料查看都有哪些方法可以遍歷集合類,在網上找到了如下的使用Enumeration和Iterator遍歷集合類的實例。不過這個實例中提到了Enumeration比Iterator的效率更高,其實並不是這樣子的,該實例是的時間測試太片面了, 因為數據量太少。隨着數據兩的增加,兩者之間的效率越來越接近,而不會出現倍數的比例。而且現在普遍都使用Iterator來遍歷集合類,只有特別明確聲明必須使用Enumeration的才會用該類遍歷集合。
代碼實例

package edu.sjtu.erplab.hash; import java.util.Enumeration; import java.util.Hashtable; import java.util.Iterator; import java.util.Map.Entry; //一個遍歷hashtable實例 public class TraveseHashTable { public static void main(String[] args) { //初始化創建hashtable Hashtable<String, String> ht = new Hashtable<String, String>(); for (int i = 0; i < 10000; i++) { ht.put("Key=" + i, "Val=" + i); } // 1. 使用Enumeration long start = System.currentTimeMillis(); Enumeration<String> en = ht.keys();//使用枚舉獲取key while (en.hasMoreElements()) { en.nextElement(); } long end = System.currentTimeMillis(); System.out.println("Enumeration keys costs " + (end - start) + " milliseconds"); // 2. 使用Enumeration start = System.currentTimeMillis(); Enumeration<String> en2 = ht.elements();//使用枚舉獲取這個key-value對 while (en2.hasMoreElements()) { en2.nextElement(); } end = System.currentTimeMillis(); System.out.println("Enumeration elements costs " + (end - start) + " milliseconds"); // 3. Iterator start = System.currentTimeMillis(); Iterator<String> it = ht.keySet().iterator();//使用迭代器獲取這個key while (it.hasNext()) { it.next(); } end = System.currentTimeMillis(); System.out.println("Iterator keySet costs " + (end - start) + " milliseconds"); // 4. Iterator start = System.currentTimeMillis(); Iterator<Entry<String, String>> it2 = ht.entrySet().iterator();//使用迭代器獲取這個key-value對 while (it2.hasNext()) { it2.next(); } end = System.currentTimeMillis(); System.out.println("Iterator entrySet costs " + (end - start) + " milliseconds"); } }
廢棄的接口:Enumeration
Enumeration接口是JDK1.0時推出的,是最好的迭代輸出接口,最早使用Vector(現在推薦使用ArrayList)時就是使用Enumeration接口進行輸出。雖然Enumeration是一個舊的類,但是在JDK1.5之后為Enumeration類進行了擴充,增加了泛型的操作應用。
Enumeration接口常用的方法有hasMoreElements()(判斷是否有下一個值)和 nextElement()(取出當前元素),這些方法的功能跟Iterator類似,只是Iterator中存在刪除數據的方法,而此接口不存在刪除操作。
為什么還要繼續使用Enumeration接口
Enumeration和Iterator接口功能相似,而且Iterator的功能還比Enumeration多,那么為什么還要使用Enumeration?這是因為java的發展經歷了很長時間,一些比較古老的系統或者類庫中的方法還在使用Enumeration接口,因此為了兼容,還是需要使用Enumeration。
List接口的常用子類
List接口常用的子類有ArrayList和Vector,兩者有許多相似的地方,下面給出這兩者之間的比較
從實際的應用開發來看,ArrayList類使用的更多。