Javaのfor文・for-each文の違いと使い分け【StreamのforEachも紹介】

Java技術メモ

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文を使うというルールで判断しましょう。