【Java学習|初心者向け】Javaのコレクション操作をマスターしよう!IterableとIteratorの仕組みを徹底解説

1. 導入:なぜループ処理の理解が重要なのか

Javaで開発をしていると、リストやセットなどのデータを「順番に取り出して処理する」場面が頻繁に出てきます。その際、単に「for文を使えばいいんでしょ?」と済ませてしまうと、複雑なデータ構造を扱えなかったり、効率の悪いコードになったりしてしまいます。Javaの「Iterable」や「Iterator」の仕組みを理解することは、コレクションを自由自在に操り、読みやすくバグの少ないコードを書くための第一歩です。

2. 基礎知識:IterableとIteratorとは?

Javaのコレクション(ListやSetなど)は、基本的に「Iterable」というインターフェースを実装しています。
Iterableは「反復可能であること」を保証するインターフェースで、これを持っているクラスは「foreach文」で回すことができます。
一方、Iteratorは「反復子」と呼ばれ、実際に「次の要素はあるか?」「次の要素をくれ!」という具体的な操作を担当するインターフェースです。
イメージとしては、Iterableは「カタログそのもの」、Iteratorは「カタログをめくる指」だと考えると分かりやすいでしょう。

3. 実装/解決策:ループの種類と使い分け

Javaには主に3つのループ方法があります。
拡張for文(foreach): 最もシンプルで推奨される書き方。Iterableを実装していれば何でも回せます。
Iteratorを用いたwhileループ: ループ中に要素を「削除」したい場合に必須となります。
伝統的なfor文: インデックス(0, 1, 2…)が必要な場合に有効です。

4. サンプルプログラム

以下のコードをコピーして実行してみてください。Listの中身を順番に取り出す基本的な方法と、Iteratorを使って安全に要素を削除する方法を紹介します。

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class LoopExample {
    public static void main(String[] args) {
        List fruits = new ArrayList<>();
        fruits.add("りんご");
        fruits.add("みかん");
        fruits.add("ぶどう");

        // 1. 拡張for文(最も一般的で読みやすい)
        System.out.println("--- 拡張for文 ---");
        for (String fruit : fruits) {
            System.out.println(fruit);
        }

        // 2. Iteratorを使ったループ(ループ中の削除が可能)
        System.out.println("--- Iteratorを使った削除 ---");
        Iterator iterator = fruits.iterator();
        while (iterator.hasNext()) { // 次の要素があるか確認
            String fruit = iterator.next(); // 次の要素を取得
            if ("みかん".equals(fruit)) {
                iterator.remove(); // 安全に要素を削除できる
            }
        }
        System.out.println("削除後のリスト: " + fruits);
    }
}

5. 応用・注意点:現場で陥りやすい罠

現場で最も注意すべき点は、「拡張for文で回している最中に、リストの要素を追加・削除してはいけない」というルールです。これを行うと「ConcurrentModificationException」というエラーが発生し、プログラムが強制終了します。
もしループ中に要素を削除したい場合は、必ず上記のサンプルで示した「Iterator」を使うようにしてください。また、最近のJavaでは「removeIf」メソッドを使って、より簡潔に条件付き削除を行うことも可能です。まずは基本のIteratorの動きをしっかり押さえてから、便利なメソッドを活用していきましょう。

コメント

タイトルとURLをコピーしました