for文とfor-each文、どっちを使えばいい?
Javaで繰り返し処理を書くとき、こんな疑問を持つ方が多いです。
「for文とfor-each文、何が違うの?どっちを使えばいいの?」
結論から言うと、インデックス(番号)が必要なときはfor文、そうでないときはfor-each文が基本です。この記事では違いと使い分けをコード例を使って解説します。
for文とは
for文は、繰り返す回数や条件を細かく指定できる繰り返し構文です。
for (int i = 0; i < 5; i++) {
System.out.println(i); // 0, 1, 2, 3, 4
}
3つの部分で構成されています。
-
初期化(
int i = 0):繰り返しの開始値 -
条件(
i < 5):この条件がtrueの間繰り返す -
更新(
i++):1回繰り返すごとに実行される
配列と組み合わせるとこうなります。
String[] fruits = {"りんご", "バナナ", "みかん"};
for (int i = 0; i < fruits.length; i++) {
System.out.println(i + ": " + fruits[i]);
}
// 0: りんご
// 1: バナナ
// 2: みかん
i というインデックスを使って「何番目の要素か」を取得できるのがfor文の特徴です。
for-each文とは
for-each文(拡張for文)は、配列やリストの要素を順番に取り出す繰り返し構文です。
String[] fruits = {"りんご", "バナナ", "みかん"};
for (String fruit : fruits) {
System.out.println(fruit);
}
// りんご
// バナナ
// みかん
fruits の中身を1つずつ fruit に取り出して処理します。インデックスを書く必要がなく、シンプルに書けます。
ArrayListなどのコレクションにも同じように使えます。
List<String> fruits = new ArrayList<>();
fruits.add("りんご");
fruits.add("バナナ");
fruits.add("みかん");
for (String fruit : fruits) {
System.out.println(fruit);
}
for文とfor-each文の使い分け
| 状況 | おすすめ |
|---|---|
| インデックス(番号)が必要 | for文 |
| 逆順や飛び飛びで繰り返したい | for文 |
| 要素を順番に取り出すだけ | for-each文 |
| コードをシンプルに書きたい | for-each文 |
インデックスが必要ない場合はfor-each文を選ぶのが基本です。コードが短くなり、読みやすくなります。
for文が必要なケース
String[] fruits = {"りんご", "バナナ", "みかん"};
// 偶数番目だけ表示したい
for (int i = 0; i < fruits.length; i += 2) {
System.out.println(fruits[i]);
}
// りんご
// みかん
// 逆順に表示したい
for (int i = fruits.length - 1; i >= 0; i--) {
System.out.println(fruits[i]);
}
// みかん
// バナナ
// りんご
このようにインデックスを使った細かい制御が必要な場合は、for文を使います。
for-each文が使えないケース
for-each文は便利ですが、使えない・使わない方がいい場面があります。
① 繰り返し中に要素を削除・追加する場合
for-each文でリストを繰り返しながら要素を削除しようとすると、ConcurrentModificationException というエラーが発生します。
List<String> fruits = new ArrayList<>();
fruits.add("りんご");
fruits.add("バナナ");
fruits.add("みかん");
// NG:for-each中にremoveするとエラーになる
for (String fruit : fruits) {
if (fruit.equals("バナナ")) {
fruits.remove(fruit); // ConcurrentModificationException!
}
}
この場合はイテレーターを使うか、Java 8以降であれば removeIf を使います。
// OK:removeIfを使う
fruits.removeIf(fruit -> fruit.equals("バナナ"));
② 複数のリストを同時に繰り返す場合
2つのリストを同じインデックスで同時に処理したい場合は、for文の方が適しています。
List<String> names = List.of("太郎", "花子", "次郎");
List<Integer> scores = List.of(80, 95, 70);
// for文で同じインデックスを使って両方を処理する
for (int i = 0; i < names.size(); i++) {
System.out.println(names.get(i) + ": " + scores.get(i) + "点");
}
// 太郎: 80点
// 花子: 95点
// 次郎: 70点
③ 配列の要素を書き換える場合
for-each文で取り出した変数に代入しても、元の配列は変わりません。
int[] numbers = {1, 2, 3, 4, 5};
// NG:元の配列は変わらない
for (int num : numbers) {
num = num * 2; // これはローカル変数への代入。配列には反映されない
}
// OK:for文でインデックスを使って書き換える
for (int i = 0; i < numbers.length; i++) {
numbers[i] = numbers[i] * 2; // 配列の要素を直接書き換えられる
}
StreamのforEachについて
Java 8以降では、Stream API を使った forEach という書き方もあります。
List<String> fruits = List.of("りんご", "バナナ", "みかん");
fruits.stream().forEach(fruit -> {
System.out.println(fruit);
});
さらに短く書くこともできます。
fruits.forEach(System.out::println);
Stream APIはデータの絞り込み・変換・集計などと組み合わせて使うことで真価を発揮します。単純な繰り返しであれば、for-each文の方がシンプルで読みやすいです。
Stream APIの詳細は別途解説しますが、「こういう書き方もある」という認識で今は十分です。
Javaの基礎をしっかり学びたい方へ
for文・for-each文はJavaの基礎の中でも特によく使う構文です。「なんとなく書けるけど、使い分けに自信がない」という方は、体系的に学び直すことをおすすめします。
学びテック
のJava基礎コースは無料で学べます。for文・for-each文をはじめ、変数・条件分岐・クラス・オブジェクト指向まで、初心者が迷わず進められるカリキュラムで構成されています。
- ✅ ブラウザ上でコードを書いて実行できる
- ✅ 演習問題で理解度を確認しながら進められる(PC推奨)
- ✅ 疑問は講師に直接質問できる
サポートは「個別」も「グループ」も選べる
- グループ講義(4,000円〜/税別):同じ段階を学ぶ仲間と一緒に参加するライブ形式の講義。
- 個別講義(6,000円〜/税別):「ここだけ詳しく聞きたい」をマンツーマンで解消できます。
まとめ
- for文:インデックスが必要・細かい制御が必要なときに使う
- for-each文:要素を順番に取り出すだけならこちらが読みやすくシンプル
-
StreamのforEach:Stream APIと組み合わせて使う応用的な書き方
迷ったときはまずfor-each文を検討し、インデックスが必要なときだけfor文を使うというルールで判断しましょう。


