JavaのIteratorとListIteratorの違いを徹底解説!特徴と使い分けのポイント
IteratorとListIteratorとは
Javaでは、コレクションに格納された要素を1つずつ順番に取り出して処理するために、IteratorとListIteratorという2つのインターフェースが提供されています。
両者は内部実装こそ異なるものの、目的はどちらも「コレクション内のデータを順次走査する」ことです。しかし、利用できるコレクションの種類や、走査中に行える操作には大きな違いがあります。
IteratorとListIteratorの主な違い一覧
| No. | 比較項目 | Iterator | ListIterator |
|---|---|---|---|
| 1 | 適用範囲 | List、Set、Queueなど、あらゆる種類のコレクションに対して使用できます。 | ArrayListやLinkedListなど、Listインターフェースを実装したクラスでのみ使用できます。 |
| 2 | オブジェクトの取得方法 | Collectionインターフェースのiterator()メソッドを呼び出して生成します。Mapの場合はkeySet()やvalues()から取得します。 | Listインターフェースに定義されたlistIterator()メソッドを呼び出して生成します。 |
| 3 | 走査方向 | 前方(先頭から末尾へ)の一方向のみ走査できます。 | hasNext()/next()による前方走査と、hasPrevious()/previous()による後方走査の両方が可能です。 |
| 4 | 要素の削除 | remove()メソッドにより、走査中の要素を安全に削除できます(追加や置換は不可)。 | remove()による削除に加え、set()による置換やadd()による追加もサポートしています。 |
| 5 | 要素の追加 | 要素の追加はできません。反復中にコレクション自体を直接変更するとConcurrentModificationExceptionが発生します。 | add()メソッドを使えば、走査中の任意のタイミングで要素を追加できます。 |
| 6 | 要素の変更(置換) | 要素の変更はできません。 | set()メソッドを呼び出すことで、直前にアクセスした要素を簡単に置換できます。 |
| 7 | インデックスの取得 | 走査中の要素のインデックスを取得する手段はありません。 | nextIndex()およびpreviousIndex()メソッドにより、走査中の要素のインデックスをいつでも取得できます。 |
サンプルコードで確認するIteratorとListIterator
JavaTester.java
import java.io.*;
import java.util.*;
public class JavaTester {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
// Iteratorによる前方走査
Iterator<Integer> itr = list.iterator();
System.out.println("Iterator traversal:");
while (itr.hasNext()) {
System.out.print(itr.next() + " ");
}
System.out.println();
// ListIteratorによる前方走査
ListIterator<Integer> i = list.listIterator();
System.out.println("ListIterator Forward traversal:");
while (i.hasNext()) {
System.out.print(i.next() + " ");
}
System.out.println();
// ListIteratorによる後方走査
System.out.println("ListIterator Backward traversal:");
while (i.hasPrevious()) {
System.out.print(i.previous() + " ");
}
}
}
実行結果
Iterator traversal: 1 2 3 4 5 ListIterator Forward traversal: 1 2 3 4 5 ListIterator Backward traversal: 5 4 3 2 1
まとめ:使い分けのポイント
SetやQueueなども含めた幅広いコレクションを、単純に一方向へ走査するだけであればIteratorで十分です。
一方、List限定にはなりますが、前後双方向の走査や、走査中の要素の追加・変更・インデックスの取得が必要なケースではListIteratorが適しています。それぞれの特徴を理解し、用途に応じて使い分けることで、より安全で読みやすいコードを書くことができます。
-
JavaでのArrayListとHashSetの違いを徹底解説!使い分けのポイントも紹介
HashSetとArrayListは、どちらもJavaコレクションフレームワークにおいて最も重要なクラスの一つです。それぞれ特徴が異なるため、用途に応じた適切な使い分けが求められます。本記事では、ArrayListとHashSetの主な違いを6つの観点から比較し、実際のサンプルコードとともにわかりやすく解説します。ArrayListとHashSetの違い一覧No.項目ArrayListHashSet1実装インターフェースListインターフェースを実装しています。Setインターフェースを実装しています。2内部構造内部的には配列(動的配列)を使って実装されています。内部的にはHashMapを使って
-
JavaのIteratorとListIteratorの違いを徹底解説!特徴と使い分けのポイント
IteratorとListIteratorとは Javaでは、コレクションに格納された要素を1つずつ順番に取り出して処理するために、IteratorとListIteratorという2つのインターフェースが提供されています。 両者は内部実装こそ異なるものの、目的はどちらも「コレクション内のデータを順次走査する」ことです。しかし、利用できるコレクションの種類や、走査中に行える操作には大きな違いがあります。 IteratorとListIteratorの主な違い一覧 No.比較項目IteratorListIterator 1適用範囲List、Set、Queueなど、あらゆる種類のコレクションに対し