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

JavaのIteratorとEnumerationの違いを徹底比較!使い分けのポイントを解説

はじめに:IteratorとEnumerationとは

Javaのコレクションフレームワークには、コレクション内の要素を順番に走査(トラバース)しながらアクセスするための仕組みとして「カーソル」が用意されています。その代表格が Iterator(イテレータ)Enumeration(列挙) の2つです。

両者はどちらもコレクションフレームワークに属しますが、登場した時期と役割が異なります。EnumerationはJDK 1.0から存在する歴史あるインターフェースで、IteratorはJDK 1.2でコレクションフレームワークとともに導入された、より新しいインターフェースです。

Enumeration(列挙)の特徴

Enumerationは要素に対して読み取り専用のアクセスしか持たないため、走査中にコレクションへ構造的な変更(要素の追加・削除など)を行うことができません。主なメソッドは以下の2つです。

  • hasMoreElements():まだ次の要素が存在するかどうかを判定する
  • nextElement():次の要素を取得する

Iterator(イテレータ)の特徴

一方、Iteratorは要素の読み取りに加えて、走査中にコレクションから要素を安全に削除することができます。主なメソッドは以下の3つです。

  • hasNext():次の要素が存在するかどうかを判定する
  • next():次の要素を取得する
  • remove():直前に取得した要素をコレクションから削除する

IteratorとEnumerationの比較表

番号項目IteratorEnumeration
1基本動作走査中に要素の読み取りと削除が可能走査中に要素の読み取りのみ可能
2利用できるクラスコレクションフレームワークのすべてのクラスで使用可能(List、Setなど)VectorやHashtableなどのレガシークラスでのみ使用可能
3フェイルファスト / フェイルセーフフェイルファスト:反復中に別スレッドなどがコレクションを変更すると ConcurrentModificationException をスローするフェイルセーフ:反復中にコレクションが変更されても例外はスローされない
4制限事項反復できるのは前方向のみ(双方向には ListIterator を使う)remove操作が不可。要素の削除はできない
5主なメソッドhasNext()
next()
remove()
hasMoreElements()
nextElement()

Enumerationのサンプルコード

class EnumerationExample {
    public static void main(String args[]) {
        List list = new ArrayList(Arrays.asList(new String[] {"Apple", "Cat", "Dog", "Rat"}));
        Vector v = new Vector(list);
        delete(v, "Dog");
    }

    private static void delete(Vector v, String name) {
        Enumeration e = v.elements();
        while (e.hasMoreElements()) {
            String s = (String) e.nextElement();
            if (s.equals(name)) {
                // Enumeration自体にはremove()がないため
                // コレクション側のremove()を直接呼び出す必要がある
                v.remove(name);
            }
        }

        // 名前の一覧を表示
        System.out.println("The names are:");
        e = v.elements();
        while (e.hasMoreElements()) {
            // 要素を出力
            System.out.println(e.nextElement());
        }
    }
}

Iteratorのサンプルコード

class IteratorExample {
    public static void main(String args[]) {
        List list = new ArrayList(Arrays.asList(new String[] {"Apple", "Cat", "Dog", "Rat"}));
        Vector v = new Vector(list);
        delete(v, "Dog");
    }

    private static void delete(Vector v, String name) {
        Iterator i = v.iterator();
        while (i.hasNext()) {
            String s = (String) i.next();
            if (s.equals(name)) {
                // Iteratorのremove()を使えば
                // ConcurrentModificationExceptionを避けて安全に削除できる
                i.remove();
            }
        }

        // 名前の一覧を表示
        System.out.println("The names are:");
        i = v.iterator();
        while (i.hasNext()) {
            System.out.println(i.next());
        }
    }
}

まとめ:どちらを使うべきか?

現代のJava開発では、特別な理由がない限りIteratorを使用するのが推奨されます。Iteratorは全てのコレクションクラスで利用でき、要素の安全な削除も可能だからです。

一方、EnumerationはVectorやHashtableといったレガシーなクラスとの互換性のために残されているインターフェースであり、新規コードで積極的に使う場面はほとんどありません。既存のレガシーコードを保守する際に理解しておけば十分でしょう。

  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など、あらゆる種類のコレクションに対し