java.util.Iterator 接口描述的是以统一的方式对各种集合元素进行遍历 / 迭代的工具,也称“迭代器”。
java.util.Iterator 接口的定义:
public interface Iterator {
boolean hasNext(); // 是否有下一个,有返回 true ,否则返回 false
Object next(); // 遍历到下一个
void remove(); // 删除当前元素
}
不难看出,允许在“遍历”过程中移除集合中的(当前遍历到的那个)元素。
其实依赖前两个方法就能完成遍历,典型的代码如下:
for(Iterator it = c.iterator(); it.hasNext(); ) {
Object o = it.next(); // 对 o 的操作 ...
}
每一种集合类返回的 Iterator 具体类型可能不同, Array 可能返回 ArrayIterator , Set 可能返回 SetIterator , Tree 可能返回 TreeIterator ,但是它们都实现了 Iterator 接口,因此,客户端不关心到底是哪种 Iterator ,它只需要获得这个 Iterator 接口即可,这就是面向对象的优势。
:试想,如果没有使用 Iterator ,遍历一个数组的方法是使用索引:
for(int i=0; i<array.size(); i++) { ... get(i) ... }
而访问一个链表( LinkedList )又必须使用 while 循环:
while((e=e.next())!=null) { ... e.data() ... }
以上两种方法客户端都必须事先知道集合的内部结构,访问代码和集合本身是紧耦合,无法将访问逻辑从集合类和客户端代码中分离出来,每一种集合对应一种遍历方法,客户端代码无法复用。而且,如果以后需要把 ArrayList 更换为 LinkedList ,则原来的客户端代码必须全部重写。
例如 1 : TestIterator.java
import java.util.Date;
import java.util.ArrayList;
import java.util.Vector;
import java.util.Iterator;
public class TestIterator{
public static void main(String[] args) {
ArrayList a = new ArrayList();
a.add("China");
a.add("USA");
a.add("Korea");
Iterator it = a.iterator(); // 用 it 完成遍历
while(it.hasNext()){
String country = (String)it.next(); // 这样就返回 String 类型
System.out.println(country);
}
Vector v = new Vector();
v.addElement(new Date());
v.addElement(new Date(200008755554L));
it = v.iterator();
while(it.hasNext()){
Date time = (Date)it.next();
System.out.println(time);
}
}
}
输出结果:
China
USA
Korea
Sun Dec 27 18:53:27 CST 2009
Tue May 04 05:59:15 CST 1976