【Java学習|初心者向け】Javaのループ処理をマスターしよう!Iteratorと拡張for文の使い分け

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

Javaでプログラミングをしていると、リストや配列の中身を一つずつ取り出して処理する機会が非常に多くあります。しかし、初心者の方は「結局どの書き方を使うのが正解なの?」と迷うことが多いのではないでしょうか。適切なループ処理を選ぶことは、コードの読みやすさを高め、バグを防ぐために非常に重要です。今回は、Javaの基本的な反復処理から、現場で必須となるIteratorまでを解説します。

2. 基礎知識:ループ処理の仕組み

Javaには主に以下の反復方法があります。

拡張for文(for-each): コレクションや配列の中身を順番に取得する最も一般的な方法です。書き方がシンプルで、読み間違いが起きにくいのが特徴です。
Iterator: コレクションを操作するための「反復子」です。最大の特徴は、ループ中に要素を安全に削除できることです。
Iterable: 「Iteratorを提供できるクラス」を指すインターフェースです。これを実装しているクラスは、拡張for文でループさせることができます。

3. 実装と使い分け

基本的には、単に中身を読み出すだけであれば「拡張for文」を使ってください。一方で、ループの中で要素を削除したい場合は、直接拡張for文を使うとエラー(ConcurrentModificationException)が発生するため、「Iterator」を使用する必要があります。

4. サンプルプログラム

以下のコードをコピーして動作を確認してみてください。

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の強み
                iterator.remove();
            }
        }
        
        System.out.println("削除後のリスト: " + fruits);
    }
}

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

初心者が一番やりがちなミスは、拡張for文によるループ中にリストから要素をremove(削除)しようとすることです。これは実行時に例外が発生します。

現場での鉄則は以下の通りです。
・単なる参照・表示なら「拡張for文」
・要素の削除や、複雑な操作を伴う場合は「Iterator」
・Java 8以降であれば、リストのremoveIfメソッドを使ってシンプルに記述することも検討しましょう。

ツールを適材適所で使い分けることで、より堅牢でメンテナンスしやすいJavaコードを書くことができます。ぜひ自分のコードで試してみてください。

コメント

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