1. 基本概念

迭代器(iterator)是一个能遍历数据集合的对象。在遍历过程中,可以查看数据项、修改数据项、添加数据项及删除数据项。

Java 类库中含有多个接口,定义了用于迭代器的方法。下面介绍其中的两个接口 Iterator 和 Iterable,它们分别来自 java.util 和 java.lang 包。

2. 接口 Iterator

Java 的接口 java.util.Iterator 中使用泛型表示迭代时要处理的项的数据类型。接口中说明了 3 个方法,分别是 hasNext、next 和 remove。

  • 方法 hasNext():查看迭代器是否有下一项返回。如果有,则 返回 true,且方法 next() 将迭代器游标移过下个元素,并返回指向该元素的引用;如果返回 false,则 抛出 NoSuchElementException 异常。
  • 方法 remove():可以删除调用 next() 时最后返回的项,如果不允许迭代器进行删除,则只需要抛出异常 UnsupportedOperationException。必须先调用 next() 才能使用 remove(),且每次调用 next() 之后只能进行一次本方法。

接口 Iterator 中提到的异常,都是运行时异常,故不需要在任何方法头部写 throws 子句。另外,也不需要写 try-catch 块。但是,必须从包 java.util 引入 NoSuchElementException。

迭代器中使用游标表示其中的位置。假定数据集合中有A、B、C、D,则游标可能的位置如下:

Phaser java 层次 java seperator_JavaSE

可以看出,若集合中有 4 个元素,则游标的位置可能有 5 个。

初始时,游标在最前面的一个位置。每执行一次 next() 方法,游标移过下一项。当到达最后一个位置时,调用 hasNext() 时会返回 false。

假定,迭代器的游标当前位置在 A 和 B 之间,如图(a)所示。则执行 next() 方法后,游标位置在 B 和 C 之间,且 next() 方法的返回值是 B,如图(b)所示。

图(a)

Phaser java 层次 java seperator_迭代器_02


图(b)

Phaser java 层次 java seperator_迭代器_03

重复调用 next 可以在集合中进行遍历。迭代过程中,迭代器返回一项又一项。一旦 next 已经到达集合中的最后一项,后面再调用它都会引发 NoSuchElementException 异常。

方法 remove 删除 next 刚返回的项。如图(b),如果在 next() 方法之后调用 remove(),则将从集合中删除 B,不过,游标位置不变,仍在 C 之前。

3. 接口Iterable

让一个类实现标准接口 java.lang.Iterable,也可以得到迭代器。接口 Iterable 仅声明了一个方法 iterator,它返回一个符合 Iterator 接口的迭代器。如下所示:

package java.lang
public interface Iterable<T>
{
   Iterator<T> iterator();
}

使用迭代器示例

ListInterface<String> nameList = new MyList<> ();
nameList.add("A ");
nameList.add("B ");
nameList.add("C ");

要得到 nameList 的迭代器,可以调用 nameList 的方法 iterator(),如下所示。

Iterator<String> nameIterator = nameList.iterator();