详解 Java 中的 Iterable、Itetator、Enumeration
Java 中对一些集合循环遍历做了一些特殊的封装。一些是方便我们的操作,一些是存在存储性能等方面设计的。关于 Iterable、Itetator、Enumeration,我们一起来学习它们。
Iterable
Iterable接口实现后的功能是“返回”一个迭代器,我们常用的实现了该接口的子接口有: Collection, Deque, List, Queue, Set 等.该接口的iterator()方法返回一个标准的Iterator实现。实现这个接口允许对象成为 For each 语句的目标。就可以通过For each语法遍历底层序列。
采用ArrayList对随机访问比较快,而for循环中的get()方法,采用的即是随机访问的方法,因此在ArrayList里,for循环较快。
采用LinkedList则是顺序访问比较快,iterator中的next()方法,采用的即是顺序访问的方法,因此在LinkedList里,使用iterator较快。
Iterator
在Java集合框架中Iterator用来替代Enumeration,Iterator允许调用者在迭代中从底层集合中删除元素。
接口方法如下:
boolean hasNext();//如果迭代中还有元素返回true。
Object next();//返回迭代中的下一个元素。
void remove();//迭代器从底层集合中删除刚返回的元素。该方法只能在每次调用next后调用一次。
具体用法如下:
public class TestIterator {
public static void main(String[] args) {
List list=new ArrayList();
Map map=new HashMap();
//初始化list和map的数据
for(int i=0;i<10;i++){
list.add(new String("list"+i) );
map.put(i, new String("map"+i));
}
Iterator iterList= list.iterator();//List接口实现了Iterable接口
//循环list
while(iterList.hasNext()){
System.out.println((String)iterList.next());
}
//for each是jdk5.0新增加的一个循环结构,可以用来处理集合中的每个元素而不用考虑集合定下标。
//如需删除集合元素,慎用!!!
for(String str : list){
System.out.println(str);
}
Iterator iterMap=map.entrySet().iterator();
//循环map
while(iterMap.hasNext()){
System.out.println((Map.Entry)iterMap.next().getValue());
}
}
}
Enumeration
枚举接口,其作用和Iterator类似。只提供了遍历Vector和HashTable类型集合元素的功能,不支持元素的移除操作。
//是否还有元素,如果有返回true,否则表示至少含有一个元素
boolean hasMoreElements();
//如果Enumeration枚举对象还有元素,返回对象只能的下一个元素,否则抛出NoSuchElementException异常。
E nextElement();
使用教程如下:
public class TestEnumeration{
public static void main(String[] args){
//初始化创建Vector
Vector v = new Vector();
v.addElement("Lisa");
v.addElement("Billy");
v.addElement("Mr Brown");
Enumeration e = v.elements();//返回Enumeration对象
while(e.hasMoreElements()){
String value = (String)e.nextElement();//调用nextElement方法获得元素
System.out.print(value);
}
//初始化创建hashtable
Hashtable<String, String> ht = new Hashtable<String, String>();
for (int i = 0; i < 10000; i++) {
ht.put("Key=" + i, "Val=" + i);
}
//1.Enumeration
Enumeration<String> en = ht.keys();//使用枚举获取key
//下面的也可以哦
//Enumeration<String> en = ht.elements();//使用枚举获取这个key-value对
while (en.hasMoreElements()) {
System.out.print((String) en.nextElement());
}
//2.Iterator 迭代器
//使用迭代器获取这个key-value对
Iterator<Entry<String, String>> it1 = ht.entrySet().iterator();
//使用迭代器获取这个key
//Iterator<String> it2 = ht.keySet().iterator();
while (it.hasNext()) {
//System.out.print((Entry<String, String>) it1.next().getKey());
//System.out.print((String) it2.next());
}
}
}
本文由 创作,采用 知识共享署名4.0 国际许可协议进行许可。本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。最后编辑时间为: 2021/05/18 02:05