// 对 t 的操作...
}
每一种集合类返回的 Iterator 具体类型可能不同,Array 可能返回 ArrayIterator,Set 可
能返回 SetIterator,Tree 可能返回 TreeIterator,但是它们都实现了 Iterator 接口,因此,客
户端不关心到底是哪种 Iterator,它只需要获得这个 Iterator 接口即可,这就是面向对象的威
力。
Iterator 源码剖析
让我们来看看 AbstracyList 如何创建 Iterator。首先 AbstractList 定义了一个内部类
(inner class):
private class Itr implements Iterator {
...
}
而 iterator()方法的定义是:
public Iterator iterator() {
return new Itr();
}
因此客户端不知道它通过 Iterator it = a.iterator();所获得的 Iterator 的真正类型。
现在我们关心的是这个申明为 private 的 Itr 类是如何实现遍历 AbstractList 的:
private class Itr implements Iterator {
int cursor = 0;
int lastRet = -1;
int expectedModCount = modCount;
}
Itr 类依靠 3 个 int 变量(还有一个隐含的 AbstractList 的引用)来实现遍历,cursor 是
下一次 next()调用时元素的位置,第一次调用 next()将返回索引为 0 的元素。lastRet 记录上
一次游标所在位置,因此它总是比 cursor 少 1。
变量 cursor 和集合的元素个数决定 hasNext():
public boolean hasNext() {
return cursor != size();
}
方法 next()返回的是索引为 cursor 的元素,然后修改 cursor 和 lastRet 的值:
public Object next() {
checkForComodification();
try {
Object next = get(cursor);