Java
 Computer >> コンピューター >  >> プログラミング >> Java

JavaのIteratorとListIteratorの違いを徹底解説!特徴と使い分けのポイント

IteratorとListIteratorとは

Javaでは、コレクションに格納された要素を1つずつ順番に取り出して処理するために、IteratorListIteratorという2つのインターフェースが提供されています。

両者は内部実装こそ異なるものの、目的はどちらも「コレクション内のデータを順次走査する」ことです。しかし、利用できるコレクションの種類や、走査中に行える操作には大きな違いがあります。

IteratorとListIteratorの主な違い一覧

No.比較項目IteratorListIterator
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が適しています。それぞれの特徴を理解し、用途に応じて使い分けることで、より安全で読みやすいコードを書くことができます。

  1. JavaでのArrayListとHashSetの違いを徹底解説!使い分けのポイントも紹介

    HashSetとArrayListは、どちらもJavaコレクションフレームワークにおいて最も重要なクラスの一つです。それぞれ特徴が異なるため、用途に応じた適切な使い分けが求められます。本記事では、ArrayListとHashSetの主な違いを6つの観点から比較し、実際のサンプルコードとともにわかりやすく解説します。ArrayListとHashSetの違い一覧No.項目ArrayListHashSet1実装インターフェースListインターフェースを実装しています。Setインターフェースを実装しています。2内部構造内部的には配列(動的配列)を使って実装されています。内部的にはHashMapを使って

  2. JavaのIteratorとListIteratorの違いを徹底解説!特徴と使い分けのポイント

    IteratorとListIteratorとは Javaでは、コレクションに格納された要素を1つずつ順番に取り出して処理するために、IteratorとListIteratorという2つのインターフェースが提供されています。 両者は内部実装こそ異なるものの、目的はどちらも「コレクション内のデータを順次走査する」ことです。しかし、利用できるコレクションの種類や、走査中に行える操作には大きな違いがあります。 IteratorとListIteratorの主な違い一覧 No.比較項目IteratorListIterator 1適用範囲List、Set、Queueなど、あらゆる種類のコレクションに対し