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の動きをしっかり押さえてから、便利なメソッドを活用していきましょう。

コメント