JavaのIterator(イテレータ)入門:コレクションを順番に取り出す方法

こんにちは。ゆうせいです。

今回は、新人エンジニアの皆さんに向けてJavaの「Iterator(イテレータ)」について解説します。

Iteratorは、コレクション(ListやSetなど)に格納された要素を1つずつ取り出すための仕組みです。

「拡張for文でループできるのに、Iteratorを使う意味ってあるの?」
そんな疑問にも、しっかり答えていきますよ!


Iteratorとは何か?

イテレータは「繰り返し処理の専用ツール」

JavaのIteratorは、コレクションを「次の要素があるか?」「次の要素は何か?」と確認しながら進める道具です。

イメージ:

ガチャポンのカプセルを一つずつ取り出していく機械。
「まだある? → あったら次を出す!」という仕組みがIterator。


Iteratorの基本構造

インターフェースの定義(覚えるのはこの3つ)

public interface Iterator<E> {
    boolean hasNext();   // 次の要素があるか?
    E next();            // 次の要素を返す
    void remove();       // 今取り出した要素を削除(任意)
}


Iteratorの使い方:基本例

List<String> fruits = Arrays.asList("りんご", "バナナ", "みかん");

Iterator<String> iterator = fruits.iterator();

while (iterator.hasNext()) {
    String fruit = iterator.next();
    System.out.println(fruit);
}

実行結果:

りんご  
バナナ  
みかん


Iteratorとfor-eachの違い

for (String fruit : fruits) {
    System.out.println(fruit);
}

このfor-each文の裏側で、実はIteratorが使われているんです。

じゃあ、なぜ明示的にIteratorを使う?

答え:

要素を削除したいとき、Iteratorを使わないとエラーになる!

List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));

Iterator<String> it = list.iterator();
while (it.hasNext()) {
    String s = it.next();
    if (s.equals("B")) {
        it.remove(); // 安全に削除できる!
    }
}
System.out.println(list); // [A, C]


拡張for文で削除するとどうなる?

for (String s : list) {
    if (s.equals("B")) {
        list.remove(s); // 例外発生!ConcurrentModificationException
    }
}

結論:

  • 削除したいならIteratorを使え!
  • 読み取りだけならfor-eachでOK!

SetやMapでも使える?

SetももちろんOK!

Set<String> set = new HashSet<>(Arrays.asList("X", "Y", "Z"));
Iterator<String> it = set.iterator();
while (it.hasNext()) {
    System.out.println(it.next());
}

Mapは少し工夫が必要!

Map<String, String> map = new HashMap<>();
map.put("apple", "りんご");
map.put("banana", "バナナ");

Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();
while (it.hasNext()) {
    Map.Entry<String, String> entry = it.next();
    System.out.println(entry.getKey() + " → " + entry.getValue());
}


Iteratorのメリット・デメリット

項目内容
メリット要素を安全に削除しながらループ可能、すべてのコレクションで使える
デメリット記述がやや冗長、読み取りだけならfor-eachのほうが簡単

図で理解するIteratorの動き

List: [A] → [B] → [C]

Iteratorの動作:

1. hasNext() → true
2. next() → "A"
3. hasNext() → true
4. next() → "B"
   remove() → Bを削除
5. hasNext() → true
6. next() → "C"
7. hasNext() → false


Iterator以外の反復手段も学ぼう!

方法特徴
拡張for文シンプルに全要素を走査
forEach()メソッドJava 8以降のラムダ式対応
ListIterator双方向に移動できるイテレータ(後述)
Stream宣言的で強力な操作が可能(filter/mapなど)

今後の学習のステップ

  • ListIteratorで「後ろにも戻れる」イテレータを学ぼう!
  • Iterableインターフェースを実装して、自作のクラスでもfor-eachを使えるように!
  • Stream APIとの使い分けも理解しよう!

Iteratorは、コレクション操作の「基本のキ」です。
しっかり理解して、安心してコレクションを操作できるようになりましょう!

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。