Javaのfor文の使い方を完全解説|基本構文から現場での書き方まで

この記事では、Javaのfor文の基本構文から、break・ネスト・拡張for文・while文との使い分けまでを体系的に解説します。

Zettoのライタープロフィール

本記事の専門性
6年目エンジニアのZettoです。JavaGoldを保有しており、Javaを用いた複数の開発案件を担当してきました。それらの知見を元に解説します。

for文がわからないまま進むと、配列操作もリスト処理もつまずき続けることになります。実務でもfor文は毎日のように登場するため、早めに土台を固めておくといいでしょう。

この記事を読めば、for文の書き方を完全に理解し、現場で使えるレベルの繰り返し処理が書けるようになります。

ぜひ参考にしてみてください。

目次

Javaのfor文とは|3つの式と実行の仕組みを理解する

Javaのfor文と3つの式

for文は、Javaにおける繰り返し処理の基本構文です。

  • 基本構文(初期化式・条件式・更新式)それぞれの役割
  • for文が動く流れ|実行順序をステップで確認する
  • 初心者がはまりやすい変数スコープの誤解

順番に見ていきましょう。

基本構文(初期化式・条件式・更新式)

for文の基本構文は次の通りです。

for (初期化式; 条件式; 更新式) {
    // 繰り返す処理
}

3つの式にはそれぞれ明確な役割があります。

  • 初期化式:ループ開始前に一度だけ実行される(例:int i = 0
  • 条件式:各繰り返しの前に評価され、falseになるとループが終わる(例:i < 5
  • 更新式:処理ブロックが終わるたびに実行される(例:i++

具体的なコードで確認してみましょう。

for (int i = 0; i < 5; i++) {
    System.out.println(i);
}
// 出力:0, 1, 2, 3, 4

iは0から始まり、i < 5が真の間だけ処理が実行されます。i++で毎回1ずつ増えるため、5になった時点でループが終わります。

for文が動く流れ|実行順序をステップで確認する

for文の実行順序を正確に把握しておくことは大切です。

意外と「なんとなく動いている」状態のまま進んでしまう人が多いので、ここでしっかり確認しておきましょう。

実行の流れはこうなります。

  1. 初期化式が実行される(1回だけ)
  2. 条件式が評価される
  3. 条件式がtrueなら処理ブロックを実行、falseならループ終了
  4. 更新式が実行される
  5. 2に戻る
for (int i = 0; i < 3; i++) {
    System.out.println("i = " + i);
}

このコードの実行順序を追うと、こうなります。

int i = 0(初期化)
0 < 3 → true → "i = 0" 出力 → i++でi=1
1 < 3 → true → "i = 1" 出力 → i++でi=2
2 < 3 → true → "i = 2" 出力 → i++でi=3
3 < 3 → false → ループ終了

この順序を頭に入れておくと、後述するbreak・continueの動きも理解しやすくなります。

初心者がはまりやすい変数スコープの誤解

for文の中で宣言した変数は、for文の外からはアクセスできません。

for (int i = 0; i < 3; i++) {
    System.out.println(i);
}
// System.out.println(i); // コンパイルエラー!iはここでは使えない

for文の初期化式で宣言したiは、そのfor文ブロックの中だけで有効です。これを「スコープ(変数が使える範囲)」と言います。ループの外でも使いたい場合は、for文の前に宣言する必要があります。

int i;
for (i = 0; i < 3; i++) {
    System.out.println(i);
}
System.out.println("ループ後のi: " + i); // 3が出力される

僕自身、Javaを使い始めた頃に「なぜここでiが使えないんだ」と悩んだ経験があります。スコープの概念は最初に正しく理解しておくと、後々のエラーが減ります。

for文の3つの式と実行順序、スコープを押さえれば、基本的な使い方の土台はできています。

Zetto

for文は「3つの式が揃って初めて動く」という構造を理解しておくと、応用構文も迷わず読めるようになります。初期化・条件・更新の役割を体に染み込ませるまで、何度もコードを動かしてみてください。

for文の書き方|基本パターンからbreak・ネストまで

for文の書き方と基本パターン

for文の構造を理解したら、実際の書き方パターンを学んでいきましょう。

  • 数値の合計・カウントを計算する基本パターン
  • 配列・Listを繰り返す書き方
  • break・continueで繰り返しを制御する
  • ネスト(多重ループ)の書き方と注意点
  • 無限ループの書き方と終了条件の設計

順番に確認していきます。

数値の合計・カウントを計算する基本パターン

for文の最も典型的な使い方が、数値の合計計算やカウント処理です。

// 1〜10の合計を計算する
int sum = 0;
for (int i = 1; i <= 10; i++) {
    sum += i;
}
System.out.println("合計: " + sum); // 55
// 偶数の個数をカウントする
int count = 0;
for (int i = 1; i <= 20; i++) {
    if (i % 2 == 0) {
        count++;
    }
}
System.out.println("偶数の個数: " + count); // 10

合計を求めるときは「ループ変数の範囲」と「累積変数の初期値」に注意してください。累積変数(sumcount)はfor文の外で宣言し、0で初期化するのが基本です。

僕はJavaを使い始めた頃に合計計算で<=<をよく混同していました。1〜10の合計ならi <= 10、0から始めて10個ならi < 10というように「どこで終わるか」を意識するとミスが減ります。

配列・Listを繰り返す書き方

配列やListをfor文で操作するのは、実務でも頻繁に出てきます。

配列の繰り返し

String[] fruits = {"apple", "banana", "orange"};

for (int i = 0; i < fruits.length; i++) {
    System.out.println(fruits[i]);
}

配列の長さは配列名.lengthで取得できます。インデックスは0始まりなので、条件式はi < fruits.length<=ではなく<)になります。

Listの繰り返し

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

List list = new ArrayList<>();
list.add("Java");
list.add("Python");
list.add("JavaScript");

for (int i = 0; i < list.size(); i++) {
    System.out.println(list.get(i));
}

Listの長さはlist.size()で取得し、要素へのアクセスはlist.get(i)を使います。配列と違う点なので混同しないように注意してください。

break・continueで繰り返しを制御する

for文の中でbreakcontinueを使うと、ループの流れを細かく制御できます。

breakでループを終了する

for (int i = 0; i < 10; i++) {
    if (i == 5) {
        break; // i が5になった時点でループを抜ける
    }
    System.out.println(i);
}
// 出力:0, 1, 2, 3, 4

breakはループを即座に終了させます。「条件を満たしたら処理を打ち切る」というケースでよく使います。

continueで特定の処理をスキップする

for (int i = 0; i < 10; i++) {
    if (i % 2 == 0) {
        continue; // 偶数のときはスキップ
    }
    System.out.println(i);
}
// 出力:1, 3, 5, 7, 9

continueは現在のイテレーションの残りの処理をスキップし、次のループへ進みます。「特定の条件のときだけ処理しない」というケースで使います。

ネスト(多重ループ)の書き方と注意点

for文の中にfor文を入れることを「ネスト(多重ループ)」と呼びます。

for (int i = 1; i <= 3; i++) {
    for (int j = 1; j <= 3; j++) {
        System.out.println("i=" + i + ", j=" + j);
    }
}

このコードは3×3=9回の処理が実行されます。ネストが深くなるほど処理回数は指数的に増えるため、パフォーマンスへの影響に注意が必要です。

ネストは2階層までを目安にして、それ以上深くなりそうなら処理をメソッドに分割することを検討してください。

また、ネスト内でbreakを使う場合、内側のfor文しか抜けられない点にも注意してください。外側のループごと抜けたいときは、ラベルを使います。

outer:
for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
        if (j == 1) {
            break outer; // 外側のループも含めて終了
        }
        System.out.println("i=" + i + ", j=" + j);
    }
}

無限ループになる書き方と終了条件の設計

for文の3つの式をすべて省略すると、無限ループになります。

for (;;) {
    // 繰り返す処理
    if (終了条件) {
        break;
    }
}

無限ループは「いつ終わるかが事前に決まっていない処理」に使います。ただし、終了条件を設計しないと本当に無限に動き続けるため、breakによる脱出条件を必ずセットで設計してください。

実務では無限ループよりもwhile(true)で書く場合が多いです。for文で書く場合は意図が伝わりにくいこともあるので、チームのコーディング規約に従うのがいいでしょう。

拡張for文(for-each)の使い方と通常for文との違い

拡張for文とfor文の違い

Javaには、コレクションや配列を簡潔に繰り返すための「拡張for文(for-each文)」があります。

  • 拡張for文の基本構文とサンプルコード
  • 通常for文 vs 拡張for文|どちらを選ぶかの判断基準
  • 拡張for文が使えないケースと対処法

場面によって使い分けられるように、それぞれ確認していきましょう。

拡張for文の基本構文とサンプルコード

拡張for文の構文は次の通りです。

for (型 変数名 : 配列またはコレクション) {
    // 処理
}

通常のfor文と比べて、インデックス管理が不要になります。

String[] fruits = {"apple", "banana", "orange"};

// 拡張for文
for (String fruit : fruits) {
    System.out.println(fruit);
}
import java.util.List;

List languages = List.of("Java", "Python", "Go");

for (String lang : languages) {
    System.out.println(lang);
}

コードがシンプルで読みやすくなるのが最大のメリットです。インデックスを必要としない「全要素をただ順番に処理する」ケースでは、拡張for文を使う方がコードの意図が伝わりやすくなります。

通常for文 vs 拡張for文|どちらを選ぶかの判断基準

どちらを使うかは「インデックス(添字)が必要かどうか」で判断するのがシンプルです。

判断ポイント
インデックスが必要 → 通常for文
途中で要素を変更したい → 通常for文
コレクションの全要素を順番に処理 → 拡張for文
逆順に繰り返したい → 通常for文

実務での判断基準をまとめると以下の通りです。

  • 全要素を順番に読み取るだけ → 拡張for文
  • インデックスを使った操作が必要 → 通常for文
  • 要素の削除・追加が必要 → 通常for文(IteratorやStream APIも選択肢)

実際に僕がJavaの現場で意識しているのは、「まず拡張for文で書いてみて、インデックスが必要になったら通常for文に切り替える」という方針です。コードのシンプルさを優先する方が、後から読み返したときに意図が伝わりやすいからです。

拡張for文が使えないケースと対処法

拡張for文が使えない、もしくは適さないケースをまとめます。

  • 逆順の繰り返し:for (int i = arr.length - 1; i >= 0; i--) のように通常for文を使う
  • インデックスを使った要素の上書き:arr[i] = 新しい値; のように通常for文を使う
  • ループ中にListから要素を削除:ConcurrentModificationException(並行変更例外)が発生するため、IteratorまたはremoveIfを使う
// ループ中の削除はIteratorを使う
Iterator it = list.iterator();
while (it.hasNext()) {
    String s = it.next();
    if (s.equals("banana")) {
        it.remove(); // 安全に削除できる
    }
}

拡張for文が便利な場面は多いですが、「使えない場面」を知っておくことでエラーで詰まる時間を減らせます。

拡張for文と通常for文を場面で使い分けられるようになると、コードの可読性がぐっと上がります。

Zetto

拡張for文は「全部読む」、通常for文は「細かく制御する」という使い分けが基本です。最初は拡張for文を試して、できない操作があったら通常for文に切り替えるくらいの感覚で問題ありません。

while文とfor文の使い分け|現場の選択基準

while文とfor文の使い分け

for文だけでなく、Javaにはwhile文やdo-while文もあります。

  • for文・while文・do-while文をどう使い分けるか
  • 現役エンジニアが実務で使うfor文の典型パターン

現場での選択基準を踏まえて解説します。

for文・while文・do-while文をどう使い分けるか

3つの繰り返し構文の特徴を整理すると以下の通りです。

  • for文:繰り返し回数が事前にわかっている場合に使う
  • while文:繰り返し回数が事前にわからず、条件が満たされる間だけ繰り返す場合に使う
  • do-while文:最低1回は必ず処理を実行し、その後条件を評価する場合に使う
// while文の例:ユーザー入力が"exit"になるまで繰り返す
Scanner scanner = new Scanner(System.in);
String input = "";
while (!input.equals("exit")) {
    input = scanner.nextLine();
    System.out.println("入力: " + input);
}
// do-while文の例:最低1回は処理を実行する
int num;
do {
    System.out.print("1以上の整数を入力してください: ");
    num = scanner.nextInt();
} while (num < 1);

実務での感覚的な選択基準はシンプルです。「ループ回数がわかっている→for文」「わからない→while文」「必ず1回は実行したい→do-while文」という判断で大抵のケースは対応できます。

現役エンジニアが実務で使うfor文の典型パターン

僕がJavaの現場(大手商業施設の在庫管理システムや医療機器系のシステム)で実際に書いてきたfor文のパターンを紹介します。

データのバッチ処理

List orders = getOrdersFromDB(); // DBから注文一覧を取得

for (Order order : orders) {
    if (order.getStatus() == OrderStatus.PENDING) {
        processOrder(order); // 未処理の注文を処理
    }
}

件数のカウントと集計

int errorCount = 0;
for (Result result : results) {
    if (!result.isSuccess()) {
        errorCount++;
        logger.warn("処理失敗: " + result.getId());
    }
}
System.out.println("エラー件数: " + errorCount);

インデックスを使った比較処理

for (int i = 0; i < dataList.size() - 1; i++) {
    if (dataList.get(i).getValue() > dataList.get(i + 1).getValue()) {
        // 前の要素の方が大きい場合の処理
    }
}

実務ではリストを回してステータスチェック・集計・変換をするパターンが圧倒的に多いです。基本的な書き方を身に付けておけば、現場でも自然と書けるようになります。

for文とwhile文を使い分けられるようになると、繰り返し処理に関してはほぼ困ることがなくなります。

Javaのfor文を試す演習課題3つ

ここまで学んだ内容を、実際に手を動かして確認しましょう。

この章では、3つの演習問題を用意しました。

  • 累積処理を使った基本のfor文
  • 配列とfor文を組み合わせた問題
  • ネストしたfor文(二重ループ)を使った問題

解答例を確認する前に、まず自分でコードを書いてみることをおすすめします。

演習1:1〜100までの整数の合計を出力しよう

for文で1から100まで順番に足し込み、合計値を出力してください。正しく書けていれば、出力結果は5050になるはずです。

解答例:

int sum = 0;

for (int i = 1; i <= 100; i++) {
    sum += i;
}

System.out.println("合計:" + sum);

ポイントは「ループの外で変数を初期化する」ことです。sumをループの中で宣言してしまうと、毎回リセットされて正しく累積できません。

演習2:配列の中から最大値を見つけよう

配列{10, 3, 7, 1, 9}の中から最大値を見つけて出力するコードを書いてください。

解答例:

int[] numbers = {10, 3, 7, 1, 9};
int max = numbers[0];

for (int i = 1; i < numbers.length; i++) {
    if (numbers[i] > max) {
        max = numbers[i];
    }
}

System.out.println("最大値:" + max);

ポイントは「最初の要素を仮の最大値としてセットする」ことです。ループ内で各要素と比較し、より大きい値が見つかったら上書きしていくイメージですね。

0などの固定値で初期化すると、配列の値によっては正しく動かないので注意です。

演習3:九九の掛け算表を出力しよう

ネストしたfor文(二重ループ)を使って、九九の掛け算表を出力するコードを書いてください。

解答例:

for (int i = 1; i <= 9; i++) {
    for (int j = 1; j <= 9; j++) {
        System.out.printf("%2d×%d=%2d  ", i, j, i * j);
    }
    System.out.println();
}

外側のループが「段(1〜9)」、内側のループが「乗数(1〜9)」を制御しています。「外側が行、内側が列」とイメージすると整理しやすいですね。

二重ループは最初は混乱しやすいですが、このパターンは現場でも頻繁に使うので、しっかり手を動かして覚えておきましょう。

Javaのfor文に関するよくある質問

Javaのfor文:よくある質問

よくある質問と回答をまとめました。

  • オフバイワンエラー(1つずれるバグ)の原因と直し方は?
  • for文とwhile文はどちらを使えばいいですか?
  • Java 8以降はStream APIに切り替えるべきですか?

一つずつ答えていきます。

1つずれるバグ(オフバイワンエラー)の原因と直し方は?

数字が1つずれるバグ(オフバイワンエラー)は、条件式の<<=を間違えることで起きるのが原因のほとんどです。

「1〜10を繰り返したい」ならi <= 10、「10個の要素を持つ配列を全部処理したい」ならi < 10(インデックスは0〜9)になります。

チェックポイントを整理すると以下の通りです。

  • 「0始まりか1始まりか」を確認する
  • 「最後の要素を含めるかどうか」を確認する
  • fruits.lengthは要素数であり、最大インデックス+1」であることを意識する

最初と最後のインデックスが正しいかを確認しましょう。

for文とwhile文はどちらを使えばいいですか?

繰り返し回数が事前にわかっているならfor文、わからないならwhile文という基準で選んでください。

配列やリストの要素数分だけ繰り返す→for文。ユーザー入力や外部APIのレスポンスを待ちながら処理する→while文です。

どちらでも書けるケースは多いですが、コードを読む側に「何回繰り返すのか」の意図が伝わりやすい方を選ぶのが原則です。

Java 8以降はStream APIに切り替えるべきですか?

Stream APIはJava 8から追加された、コレクション操作をより宣言的に書ける仕組みです。for文をすべてStream APIに統一する必要はありません。

Stream APIが有利な場面は以下の通りです。

  • フィルタリング・変換・集計を一連の操作でまとめたい
  • 並列処理(parallelStream)を使いたい
  • コードの宣言的な読みやすさを優先したい

一方、for文が有利な場面もあります。

  • デバッグしやすさが必要
  • 途中でbreakやcontinueを使いたい
  • ループ内で例外処理が複雑

実務では、シンプルな繰り返しにfor文を使い、フィルタリングや集計にはStream APIを使うという使い分けが自然かなと思います。

for文の理解が、Javaの土台を固める

for文の理解がJavaの基礎を固める

この記事では、Javaのfor文について以下の内容を解説しました。

  • for文の基本構文(初期化式・条件式・更新式)と実行順序
  • break・continue・ネストなど、実践的な書き方パターン
  • 拡張for文(for-each)の使い方と通常for文との使い分け
  • while文・do-while文との違いと現場での選択基準

for文はJavaプログラミングの中でも、最も頻繁に登場する構文のひとつです。

僕自身、Java Silverの勉強をしていたときに、for文の仕組みを丁寧に理解したことがループ処理全般への苦手意識をなくすきっかけになりました。基礎がしっかりしていると、Stream APIや並列処理も怖くなくなります。

まずは今日紹介した演習課題3つをひとつずつ試してみてください。コードを実際に動かした回数が、そのまま上達のスピードに直結します。

Zetto

Javaの現場でも、基礎的なfor文はよく使います。焦らず着実に身につけていってください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次