使用Enumeration和Iterator遍历集合类详解
前言
在数据库连接池分析的代码实例中,看到其中使用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,两者有许多相似的地方,下面给出这两者之间的比较