迭代器是一种模式,它可以使得对于序列类型的数据结构的遍历行为与被遍历的对象分离,即无需关心该序列的底层结构是什么样子的。只要拿到这个对象,使用迭代器就可以遍历这个对象的内部。
一、Iterator
Java 提供一个专门的迭代器 «interface»Iterator,可以对某个序列实现该接口,来提供标准的 Java 迭代器。实现 Iterator 后的功能是“使用”一个迭代器。文档定义:
Package java.util;
public interface Iterator<E> {
boolean hasNext();//判断是否存在下一个对象元素
E next();
void remove();
}
二、Iterable
Java 中还提供了一个 Iterable 接口,实现 Iterable 后的功能是“返回”一个迭代器,常用的实现了该接口的子接口有: Collection、Deque、List、Queue 和 Set 等。该接口的 iterator() 返回一个标准的 Iterator 实现。实现这个接口允许对象成为 For each 语句的目标。就可以通过For each语法遍历你的底层序列。
Iterable 接口包含一个能够产生 Iterator 的 iterator(),并且 Iterable 接口被 foreach 用来在序列中移动。因此如果创建了任何实现 Iterable 接口的类,都可以将它用于 foreach 语句中。文档定义:
Package java.lang;
import java.util.Iterator;
public interface Iterable<T> {
Iterator<T> iterator();
}
使用Iterator的简单例子:
import java.util.*;
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()){
String strList=(String)iterList.next();
System.out.println(strList.toString());
}
Iterator iterMap=map.entrySet().iterator();
//循环map
while(iterMap.hasNext()){
Map.Entry strMap=(Map.Entry)iterMap.next();
System.out.println(strMap.getValue());
}
}
接口 Iterator 在不同的子接口中会根据情况进行功能的扩展。例如针对List的迭代器ListIterator,该迭代器只能用于各种List类的访问。ListIterator 可以双向移动。添加了previous()等方法.
三、Iterator与泛型搭配:
Iterator 对集合类中的任何一个实现类,都可以返回这样一个 Iterator 对象。可以适用于任何一个类。因为集合类(List和Set等)可以装入的对象的类型是不确定的,从集合中取出时都是 Object 类型,用时都需要进行强制转化,这样会很麻烦,用上泛型,就是提前告诉集合确定要装入集合的类型,这样就可以直接使用而不用显示类型转换。
四、foreach和Iterator的关系
for each 以用来处理集合中的每个元素而不用考虑集合定下标。就是为了让用 Iterator 简单。但是删除的时候,区别就是在 remove,循环中调用集合remove会导致原集合变化导致错误,而应该用迭代器的 remove 方法。
for 循环和迭代器 Iterator对比:
①采用 ArrayList 对随机访问比较快,而for循环中的get(),采用的即是随机访问的方法,因此在 ArrayList 里,for循环较快
②采用 LinkedList 则是顺序访问比较快,Iterator 中的 next(),采用的即是顺序访问的方法,因此在 LinkedList 里,使用 Iterator 较快。
③从数据结构角度分析,for循环适合访问顺序结构,可以根据下标快速获取指定元素。而 Iterator 适合访问链式结构,因为迭代器是通过next()和Pre()来定位的,可以访问没有顺序的集合。
④使用 Iterator 的好处在于可以用相同方式去遍历集合中元素,而无需考虑集合类的内部实现(只要它实现了 java.lang.Iterable 接口)。如果使用 Iterator 来遍历集合中元素,一旦不再使用 List 转而使用 Set 来组织数据,那遍历元素的代码不用做任何修改;如果使用 for 来遍历,那所有遍历此集合的算法都得做相应调整。因为List有序,Set无序,结构不同,它们的访问算法也不一样。(由此也说明遍历和集合本身分离了)
网友评论