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の比較表
| 番号 | 項目 | Iterator | Enumeration |
|---|---|---|---|
| 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といったレガシーなクラスとの互換性のために残されているインターフェースであり、新規コードで積極的に使う場面はほとんどありません。既存のレガシーコードを保守する際に理解しておけば十分でしょう。
-
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など、あらゆる種類のコレクションに対し