Iterator と ListIterator の主な違いは、Iterator がコレクション内の要素を順方向にのみトラバースできるのに対し、ListIterator はコレクション内の要素を順方向と逆方向の両方でトラバースできることです。
IteratorとListIteratorは、Javaの2つのインタフェースです。
Iteratorは、リスト、セット、マップなどで使われる。
一方、ListIteratorはListのみで使用されます。
ListIteratorでは、コレクション内の項目を順方向にも逆方向にも通過することが可能である。
これに対し、Iteratorはコレクション内の項目を順方向にしか通過できない。
イテレータとは
Iterator は、Collection フレームワークのインターフェイスのひとつです。
コレクション内の各要素を順番に見ていくことができます。
リストやセット、マップをたどるのに役立ちます。
ただし、Iteratorを使ったトラバースは前方のみ可能です。
プログラム例を以下に示す。
図01:イテレータを使ったJavaプログラム
上のプログラムでは、colorsというArrayListが存在する。
addメソッドは、コレクションに項目を挿入するのに役立つ。
iterator()は、コレクションの先頭へのイテレータを返す。
whileループは、ループが反復するたびにhasNext()メソッドを呼び出します。
コレクション内に次の要素がある場合、このメソッドは真を返します。
しかし、すでにすべての要素が巡回されている場合は、false を返します。
ループの中では、next() メソッドがコレクション内の各要素を取得するのに役立ちます。
これは、コレクション内の次の要素を返します。
System.out.printlnは、コンソールにその要素を表示します。
ListIteratorとは
ListIterator はコレクションフレームワークのインターフェースで、コレクションに存在する要素を次々に走査することができます。
List に含まれる項目のみを走査することができます。
また、前方・後方の両方向に要素を走査することが可能です。
以下のプログラムを参照してください。
上のプログラムでは、colorsという名前の配列があります。
addメソッドは、コレクションに要素を挿入するのに役立つ。
listIterator()は、コレクションの先頭へのイテレータを返す。
最初の while ループでは、繰り返しごとに hasNext() メソッドを呼び出しています。
ループの内部では、next() メソッドを使用して、コレクションの次の要素を返します。
System.out.printlnは、その要素をコンソールに表示します。
したがって、すべての要素が順方向でコンソールに表示されます。
next whileループは、ループが反復するたびにhasPrevious()メソッドを呼び出します。
これは、要素がある場合はtrueを返します。
そうでない場合は、falseを返します。
このトラバースは後ろ向きで行われます。
ループ内部では、previous() メソッドがコレクション内の各要素を取得するのに役立ちます。
これは、コレクション内の前の要素を返します。
System.out.printlnは、コンソールにその要素を表示します。
IteratorとListIteratorの違い
定義
Iterator は、Java の Collection フレームワークにおいて、リストを順方向 に走査するためのインターフェースです。
これに対し、ListIterator は、Java の Collection フレームワークにおいて、リストを順方向 に走査し、反復中にリストを変更し、リスト内の現在位置を取得するイン ターフェイスです。
これがIteratorとListIteratorの主な違いです。
トラバース
IteratorとListIteratorの重要な違いは、IteratorはList、Set、Mapをトラバースできるのに対し、ListIteratorはListのみをトラバースできることです。
トラバース方向
また、Iteratorはコレクションを順方向にしか走査できないのに対して、ListIteratorは順方向にも逆方向にも走査できます。
したがって、この点もIteratorとListIteratorの違いと言える。
インデックス
さらに、IteratorとListIteratorのもう一つの違いは、Iteratorには要素のインデックスを取得するメソッドがないことです。
しかし、ListIteratorを使えば、要素のインデックスを取得することができます。
要素の追加
Iteratorはコレクションに要素を追加できませんが、ListIteratorはadd(E e)を使ってコレクションに要素を追加することができます。
ここもIteratorとListIteratorの違いです。
修正
また、IteratorとListIteratorのもう一つの違いは、Iteratorはコレクション内の要素を変更できないのに対し、ListIteratorはset(E e)を使用してコレクション内の要素を変更できることです。
共通方法
hasNext(), next(), remove() は Iterator の共通メソッド、 hasNext(), next(), hasPrevious(), previous(), remove, add(E e), previousIndex(), set(E e) は ListIterator の共通メソッドです。
結論
IteratorとListIteratorは明確に違うものですが、同じように使っている人もいます。
IteratorとListIteratorの主な違いは、Iteratorがコレクション内の要素を順方向にのみトラバースできるのに対し、ListIteratorはコレクション内の要素を順方向と逆方向の両方でトラバースできることです。