Javaの繰り返し処理であるfor文とwhile文の使い方についてまとめます。
for文とは
基本的な構文は以下のようになります。
for (式1; 式2; 式3) { 処理文; }
for文は指定した数だけ繰り返し処理を実行します。式1には繰り返し回数を示す変数の宣言と初期化を行います。式2では処理を繰り返す条件式を記述します。これは結果がboolean値になる式でなければならず、trueの間だけ処理を行い、falseになるとfor文を抜けます。式3ではカウンタ変数の値を更新する式を記述します。
拡張for文
上記の基本的な使い方とは別に拡張for文があります。これは配列やコレクション(List等)の全要素を順番に取り出して処理する場合に使用されます。
for (変数宣言 : 参照変数名) {
処理文;
}
参照変数名に配列やコレクションを指定する事で、変数宣言で宣言した変数に順番に取り出して代入していきます。なので変数宣言の変数のデータ型は必然的に参照変数と合わせる必要があります。全ての要素を取り出したら終了です。
配列やコレクションの要素全てに対して何か処理をしたい場合などは拡張for文がシンプルで分かり易いですし適していますが、基本的なfor文が必要な場合もあるので状況に合わせたものを使用しましょう。
List<String> list = new ArrayList<String>(); list.add("test1"); list.add("test2"); list.add("test3"); // for文 for (int i=0; i<list.size(); i++) { System.out.println(list.get(i)); } // 拡張for文 for (String str : list) { System.out.println(str); }
その他
for文の中に記述する式はそれぞれ省略する事ができますが気をつけて下さい。コードが読みづらくなりますしあまり省略はしない方がいいかなとは思います。
int i = 0; for (; i<10; i++) { } // 式1省略。正常…カウンタ変数を外で宣言 for (int i=0; ; i++) { } // 式2省略。コンパイルは通るが常にtrueになるため無限ループ for (int i=0; i<10; ) { } // 式3省略。処理文でカウンタ変数を更新しないと無限ループ
また、式1は文である必要があるため外で宣言しているからといって以下のようにそのまま変数を用いる事は出来ません。
int i = 0; for (i; i<10; i++) { } // コンパイルエラー for (i+=1; i<10; i++) { } // 正常
while文とは
基本的な構文は以下のようになります。
while (条件式) {
処理文;
}
while文は条件式がtrueの間だけ繰り返し処理が行われ、falseを返した時点で終了します。 そのため条件式にはboolean値を返す式を指定します。
例えばwhile(true)
と記述する事も出来ますが、この場合は当然無限ループとなります。
逆にwhile(false)
であれば一度も処理が実行されません。
while(num<5)
のようにカウンタを使用する場合は無限ループになってしまいますので、カウンタの加算を忘れないようにしましょう。
do-while文
上記while文との違いは、必ず一度は処理文が実行されるという点です。 違いを確認してみると以下のようになります。
int num = 0; // while文 while (num > 5) { System.out.println("実行されない。"); num++; } // do-while文 do { System.out.println("実行される。"); num++; } while (num > 5);
ここでは同じ条件式を使用しているため、numに0がセットされている状態ですとどちらもfalseを返します。while文の場合は条件判定が最初であるため一度も処理文が実行されませんが、do-while文の場合は条件判定が最後にきていますので、一度だけ処理文が実行されるという流れです。
関連記事
【Java】条件式のifとswitchの使い方まとめ - TASK NOTES