使用Enumeration和Iterator遍歷集合類詳解
前言
在數(shù)據(jù)庫(kù)連接池分析的代碼實(shí)例中,看到其中使用Enumeration來遍歷Vector集合。后來就找了一些資料查看都有哪些方法可以遍歷集合類,在網(wǎng)上找到了如下的使用Enumeration和Iterator遍歷集合類的實(shí)例。不過這個(gè)實(shí)例中提到了Enumeration比Iterator的效率更高,其實(shí)并不是這樣子的,該實(shí)例是的時(shí)間測(cè)試太片面了, 因?yàn)閿?shù)據(jù)量太少。隨著數(shù)據(jù)兩的增加,兩者之間的效率越來越接近,而不會(huì)出現(xiàn)倍數(shù)的比例。而且現(xiàn)在普遍都使用Iterator來遍歷集合類,只有特別明確聲明必須使用Enumeration的才會(huì)用該類遍歷集合。
代碼實(shí)例
package edu.sjtu.erplab.hash;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map.Entry;
//一個(gè)遍歷hashtable實(shí)例
public class TraveseHashTable {
public static void main(String[] args) {
//初始化創(chuàng)建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();//使用枚舉獲取這個(gè)key-value對(duì)
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();//使用迭代器獲取這個(gè)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();//使用迭代器獲取這個(gè)key-value對(duì)
while (it2.hasNext()) {
it2.next();
}
end = System.currentTimeMillis();
System.out.println("Iterator entrySet costs " + (end - start)
+ " milliseconds");
}
}
廢棄的接口:Enumeration
Enumeration接口是JDK1.0時(shí)推出的,是最好的迭代輸出接口,最早使用Vector(現(xiàn)在推薦使用ArrayList)時(shí)就是使用Enumeration接口進(jìn)行輸出。雖然Enumeration是一個(gè)舊的類,但是在JDK1.5之后為Enumeration類進(jìn)行了擴(kuò)充,增加了泛型的操作應(yīng)用。
Enumeration接口常用的方法有hasMoreElements()(判斷是否有下一個(gè)值)和 nextElement()(取出當(dāng)前元素),這些方法的功能跟Iterator類似,只是Iterator中存在刪除數(shù)據(jù)的方法,而此接口不存在刪除操作。
為什么還要繼續(xù)使用Enumeration接口
Enumeration和Iterator接口功能相似,而且Iterator的功能還比Enumeration多,那么為什么還要使用Enumeration?這是因?yàn)閖ava的發(fā)展經(jīng)歷了很長(zhǎng)時(shí)間,一些比較古老的系統(tǒng)或者類庫(kù)中的方法還在使用Enumeration接口,因此為了兼容,還是需要使用Enumeration。
List接口的常用子類
List接口常用的子類有ArrayList和Vector,兩者有許多相似的地方,下面給出這兩者之間的比較

- Java中的collection集合類型總結(jié)
- 集合類List與Dictonary實(shí)例練習(xí)
- js正則函數(shù)match、exec、test、search、replace、split使用介紹集合
- SQL集合函數(shù)中case when then 使用技巧
- Python中集合類型(set)學(xué)習(xí)小結(jié)
- Python set集合類型操作總結(jié)
- C#中DataSet轉(zhuǎn)化為實(shí)體集合類的方法
- 集合類Array List HashTable實(shí)例操作練習(xí)
- Swift教程之集合類型詳解
- C++簡(jiǎn)單集合類的實(shí)現(xiàn)方法
相關(guān)文章
Java設(shè)計(jì)模式之外觀模式(Facade模式)介紹
這篇文章主要介紹了Java設(shè)計(jì)模式之外觀模式(Facade模式)介紹,外觀模式(Facade)的定義:為子系統(tǒng)中的一組接口提供一個(gè)一致的界面,需要的朋友可以參考下2015-03-03
基于Servlet實(shí)現(xiàn)技術(shù)問答網(wǎng)站系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了基于Servlet實(shí)現(xiàn)技術(shù)問答網(wǎng)站系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
java WebSocket的實(shí)現(xiàn)以及Spring WebSocket示例代碼
本篇文章主要介紹了java WebSocket的實(shí)現(xiàn)以及Spring WebSocket,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-01-01
spring mvc中@PathVariable / 帶斜杠方式獲取
這篇文章主要介紹了spring mvc中@PathVariable / 帶斜杠方式獲取,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
java中sleep方法和wait方法的五個(gè)區(qū)別
這篇文章主要介紹了java中sleep方法和wait方法的五個(gè)區(qū)別,sleep?方法和?wait?方法都是用來將線程進(jìn)入休眠狀態(tài),但是又有一些區(qū)別,下面我們就一起來看看吧2022-05-05
Java中弱引用和軟引用的區(qū)別以及虛引用和強(qiáng)引用介紹
很早Java API就添加了弱引用(WeakReference)和軟引用(SoftReference),但并不是所有的程序員都熟悉這兩個(gè)概念2014-04-04
基于SSM實(shí)現(xiàn)學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了基于SSM實(shí)現(xiàn)學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12

