この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:6
ページ更新者:guest
更新日時:2026-06-11 07:07:02

タイトル: for文
SEOタイトル: Java for 文完全ガイド

この記事の要点
  • 基本形: for (int i = 0; i < n; i++) { ... }
  • 拡張 for (for-each): for (E e : collection) { ... } ★ コレクション処理の定番
  • 無限ループ: for (;;) { ... } または while (true)
  • 制御: break / continue / return / ラベル付き break label;
  • Stream (Java 8+): list.stream().forEach(...)IntStream.range(0, n) で関数型

Java for 文の 3 形式

1. 基本の for

// (初期化; 条件; 更新) の 3 要素
for (int i = 0; i < 10; i++) {
    System.out.println(i);
}
// → 0 1 2 ... 9

// 降順
for (int i = 9; i >= 0; i--) {
    System.out.println(i);
}

// 2 ずつ
for (int i = 0; i < 10; i += 2) {
    System.out.println(i);   // 0, 2, 4, 6, 8
}

// 複数初期化・複数更新
for (int i = 0, j = 9; i < j; i++, j--) {
    System.out.println(i + " " + j);
}
// → 0 9 / 1 8 / 2 7 / 3 6 / 4 5

2. 拡張 for (for-each, Java 5+)

// 配列
int[] nums = {1, 2, 3, 4, 5};
for (int n : nums) {
    System.out.println(n);
}

// List
List names = List.of("Taro", "Hanako", "Jiro");
for (String name : names) {
    System.out.println(name);
}

// Map
Map map = Map.of("a", 1, "b", 2);
for (Map.Entry e : map.entrySet()) {
    System.out.println(e.getKey() + ": " + e.getValue());
}

// Set
Set set = Set.of(1, 2, 3);
for (Integer n : set) {
    System.out.println(n);
}

3. 無限 for

// 無限ループ
for (;;) {
    String line = reader.readLine();
    if (line == null) break;
    process(line);
}

// 同じ意味
while (true) {
    // ...
}

break / continue / return

for (int i = 0; i < 10; i++) {
    if (i == 3) continue;   // i=3 をスキップ
    if (i == 7) break;      // i=7 でループ終了
    System.out.println(i);
}
// → 0 1 2 4 5 6

// メソッドから return
public Integer findFirst(List list, int target) {
    for (int n : list) {
        if (n == target) return n;
    }
    return null;
}

ラベル付き break / continue

ネストした for から外側のループを一気に抜けるのに便利:

outer:
for (int i = 0; i < 10; i++) {
    for (int j = 0; j < 10; j++) {
        if (i * j > 20) {
            break outer;   // ★ 外側のループも抜ける
        }
        System.out.println(i + "," + j);
    }
}

// ラベル付き continue
search:
for (int i = 0; i < rows; i++) {
    for (int j = 0; j < cols; j++) {
        if (matrix[i][j] == 0) continue search;   // 外側 for の次反復へ
        // 0 以外の処理
    }
}

Stream API (Java 8+)

// 数値範囲
IntStream.range(0, 10).forEach(System.out::println);   // 0..9
IntStream.rangeClosed(1, 10).sum();                     // 1+2+...+10 = 55

// コレクション
List names = List.of("Taro", "Hanako", "Jiro");
names.stream()
     .filter(n -> n.startsWith("T"))
     .map(String::toUpperCase)
     .forEach(System.out::println);

// Map に対する forEach
Map map = Map.of("a", 1, "b", 2);
map.forEach((k, v) -> System.out.println(k + "=" + v));

// 並列処理(注意: 順序保証なし)
list.parallelStream().forEach(n -> heavyProcess(n));

配列の走査パターン

int[] arr = {10, 20, 30, 40, 50};

// インデックスが必要
for (int i = 0; i < arr.length; i++) {
    System.out.println(i + ": " + arr[i]);
}

// インデックス不要
for (int n : arr) {
    System.out.println(n);
}

// 後ろから
for (int i = arr.length - 1; i >= 0; i--) {
    System.out.println(arr[i]);
}

// 2 次元配列
int[][] matrix = {{1,2,3}, {4,5,6}, {7,8,9}};
for (int i = 0; i < matrix.length; i++) {
    for (int j = 0; j < matrix[i].length; j++) {
        System.out.println(matrix[i][j]);
    }
}

// 2 次元 + 拡張 for
for (int[] row : matrix) {
    for (int n : row) {
        System.out.println(n);
    }
}

よくあるバグ

Off-by-one エラー

int[] arr = new int[10];

// ❌ ArrayIndexOutOfBoundsException
for (int i = 0; i <= arr.length; i++) { ... }
//                ^^ <= でなく < が正解

// ❌ 1 つ手前で終わる
for (int i = 0; i < arr.length - 1; i++) { ... }
//                                  ^^ -1 が不要かも

// ✅ 標準
for (int i = 0; i < arr.length; i++) { ... }

浮動小数で for を回す

// ❌ 累積誤差で永遠に終わらない / 件数がずれる
for (double d = 0.0; d != 1.0; d += 0.1) {
    System.out.println(d);
}

// ✅ 整数で回して必要時に浮動小数化
for (int i = 0; i <= 10; i++) {
    double d = i * 0.1;
    System.out.println(d);
}

拡張 for 中の要素削除

List list = new ArrayList<>(List.of("a", "b", "c"));

// ❌ ConcurrentModificationException
for (String s : list) {
    if (s.equals("b")) list.remove(s);
}

// ✅ Iterator で削除
Iterator it = list.iterator();
while (it.hasNext()) {
    if (it.next().equals("b")) it.remove();
}

// ✅ removeIf (Java 8+)
list.removeIf(s -> s.equals("b"));

パフォーマンス

方法速度備考
配列の通常 for★ 最速JIT 最適化が効きやすい
配列の拡張 for同等内部的に同じ
List の通常 for + get(i)ArrayList: 速い / LinkedList: 遅いLinkedList の get(i) は O(n)
List の拡張 for★ ArrayList・LinkedList ともに高速Iterator 使用
Stream forEachやや遅い関数呼出オーバーヘッド
parallelStream大量データで有利小データではむしろ遅い

FAQ

Q: while と for どちらを使うべき?
A: 回数が決まっているなら for、条件依存なら while。可読性で選んでください。

Q: 拡張 for でインデックスが欲しい
A: 通常の for を使うか、別変数で増分。または IntStream.range(0, list.size()).forEach(i -> ...)

Q: ループ中にリストを変更したい
A: 拡張 for では不可(ConcurrentModificationException)。Iterator.remove()removeIf。追加なら別リストに集めて後でまとめて追加。