古典的な3部構成の for ループ
for ループは、制御された回数だけブロックを繰り返します。Java の形式では、丸括弧の中にセミコロンで区切られた3つのものを詰め込みます:
3つの部分は決まったリズムで動きます:
- 初期化(
int i = 0)- 何よりも先に、一度だけ実行されます。 - 条件(
i < 5)- 各反復の前にチェックされ、偽になるとループは止まります。 - 更新(
i++)- 各反復のあと、条件が再びチェックされる前に実行されます。
つまりこれは i = 0 から i = 4 までを出力します。カウンタ i のスコープはループ内に限られ、閉じ波括弧のあとには存在しません。
増やす、減らす、ステップで数える
3つの部分でカウンタを完全に制御できます:
i-- は減らし、i += 5 は5ずつ跳びます。条件が方向に応じた停止を決めます:減らすときは > を、増やすときは < または <= を使います。
配列を反復処理する
カウンタ付きループは配列と自然に組み合わさり、.length を上限、i をインデックスとして使います:
colors.length は括弧のないフィールドである点に注意してください。配列はその点で特別です。一方 List は list.size() を使います。条件 i < colors.length は正しく、インデックスは 0 から length - 1 まで動くので、<(<= ではなく)を使うことで範囲外エラーを避けられます。
拡張 for-each ループ
各要素だけが必要でインデックスは一切いらないとき、拡張 for はよりすっきりしていて間違えにくくなります。1ずれ(off-by-one)を起こすカウンタがありません:
for (String color : colors) は「colors の中の各 color について」と読みます。配列や反復可能なものすべてで使えます。トレードオフ:インデックスがなく、たどっている最中にコレクションへの追加や削除ができません(それは ConcurrentModificationException を投げます)。どちらかが必要なときはカウンタ付きループに頼ってください。
ネストしたループ
ループの中のループ - グリッド、表、組み合わせに便利です。内側のループは外側の各反復ごとに完全に実行されます:
これは 3x3 の掛け算グリッドを出力します。ネストが深くなったら、カウンタに i、j ではなく意味のある名前(row、col)を付けましょう。どちらがどちらか混同せずに済みます。
break と continue
break はループから即座に抜けます。continue は現在の反復の残りを飛ばし、更新ステップへ進みます:
これは 1 3 5 7 を出力します。continue は偶数を飛ばし、break は i が 7 を超えそうになった時点でループを終了します。ネストしたループでは、ラベル付き break を使わない限り、どちらも最も内側のループにのみ作用します。
無限ループに注意
条件が決して偽にならないと、ループは永遠に動き続けます。よくある原因は、更新を忘れることや、カウンタを間違った方向に動かすことです:
for (int i = 0; i < 5; i--) { // i は減り続けるだけ -> 5 には決して達しない
System.out.println(i);
}
意図的な無限ループは3つの部分すべてを省略し -for (;;) { ... }- 内部の break に頼って止めます。これは控えめに使いましょう。while (true) のほうがたいてい読みやすくなります。
次:while ループ
for ループはカウンタが前もって分かっているときに輝きます。ある条件が変わるまで繰り返したい - そしてきれいなカウンタがない - ときには、while ループのほうが合います。それが次のページです。
よくある質問
Java の for ループの構文はどのようなものですか?
Java の for ループは、丸括弧の中にセミコロンで区切られた3つの部分を持ちます:for (初期化; 条件; 更新) { ... }。例えば for (int i = 0; i < 5; i++) { ... } は i を 0 から始め、i < 5 の間は本体を実行し、各反復のあとに i に 1 を加えます。3つの部分はすべて省略可能です。
Java の for ループと for-each ループの違いは何ですか?
古典的な for ループは明示的なカウンタを使うので、インデックスと方向を自分で制御できます。インデックスが必要なときや要素を飛ばしたいときに最適です。拡張 for-each ループ for (型 要素 : コレクション) は、インデックスなしですべての要素を順番にたどります。各要素だけが必要で位置は一切いらないときに、よりすっきりします。for-each はループ中にコレクションの構造を変更できません。
Java で配列を反復処理するにはどうすればよいですか?
カウンタ付きループでインデックス指定する -for (int i = 0; i < arr.length; i++) { arr[i] を使う; }- か、インデックスが不要なら for-each を使います:for (int x : arr) { x を使う; }。配列はサイズを .length フィールド(括弧なし)で公開し、リストは .size() を使います。