Java2になってからjava.utilパッケージがかなり充実しました。それまではVectorとHashtableを使って何でもやらなければならなかったのですが、Collectionインタフェースを始めとして、色々なインタフェースと実装クラスが提供されるようになりました。Iteratorもその中の一つで、それまでEnumerationとして提供されていた機能が見直され、より多くのインタフェースに対応するようになりました。Enumerationもまだ使えますが、過去のバージョンとの互換性という位置付けと考えたほうが良いでしょう。
代表的なIteratorの使い方というと、Listインタフェースの各項目に対する処理を行う場合でしょう。例えばリストの各要素を標準出力に出力(toString()を使って)するという場合は、
/** * リストの各要素を標準出力にtoString()を使って出力する。 * @param list 出力対象のリスト。各要素が何かは考えない。 */ public void printList(List list) { if (list == null) { return; } // ListインタフェースにはIteratorを作成するメソッドがある。 Iterator iterator = list.iterator(); // hasNext()は次の要素のチェックをする while (iterator.hasNext() == true) { // next()は次の要素を返した上で、Iteratorの参照先を一つ後に // ずらせる。 Object item = iterator.next(); if (item != null) { System.out.println(item.toString()); } } }の様なコードになります。Listインタフェースを使用しているだけなので、Listを実装したどんなクラスでも(ArrayListでもLinkedListでも、自分で作ったものでも)、このコードは使用可能です。
IteratorはEnumerationと異なり、参照先から要素を削除することも出来ます。例えば文字列(String)のリストから特定の文字列要素を削除するには、
/** * 文字列のリストから、指定した文字列を削除する。 * @param list 削除対象のリスト。 * @param item 削除しようとする要素。 */ public void removeItem(List list, String item) { if (list == null || item == null) { return; } Iterator iterator = list.iterator(); while (iterator.hasNext() == true) { String value = (String)iterator.next(); if (item.equals(value) == true) { // remove()は直前のnext()で取得できたものを削除する。 iterator.remove(); } } }というように書きます。Iterator#remove()は直前のIterator#next()で取得できた要素を、Iteratorが参照しているCollectionから削除します。next()を呼んだ後、removeを呼ぶ前にもとのListを変更してはいけません。またnext()を呼んだ後にremove()は最大1回だけ呼ぶことが出来ます。
Collectionインタフェースを実装しているクラスは、皆Iteratorを使うことが出来るので、扱いが非常にシンプルになります。