ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
while 文の基本
int i = 0;
while (i < 5) {
System.out.println(i);
i++;
}
// 0 1 2 3 4
// 条件式は boolean 限定(C と違って int は不可)
int n = 10;
// while (n) { ... } // ❌ コンパイルエラー
while (n > 0) { // ✅
n--;
}
// 単文なら波括弧省略可(推奨されない)
int j = 0;
while (j < 3) System.out.println(j++);
// 空のループも書ける(busy-wait、要注意)
while (!isReady()) ; // 末尾のセミコロンが「空文」
do-while 文
while と違い本体を 1 回は必ず実行してから条件判定します。「最低 1 回はやる」処理に。
import java.util.Scanner;
Scanner sc = new Scanner(System.in);
int input;
do {
System.out.print("1〜10 で入力: ");
input = sc.nextInt();
} while (input < 1 || input > 10); // 範囲外なら再入力
// 同じ処理を while で書くと「最初の入力前」のフラグが必要 → 冗長
boolean valid = false;
while (!valid) {
System.out.print("1〜10 で入力: ");
input = sc.nextInt();
valid = (input >= 1 && input <= 10);
}
| 項目 | while | do-while |
|---|---|---|
| 条件判定タイミング | 本体実行前 | 本体実行後 |
| 最小実行回数 | 0 回 | 1 回 |
| 典型用途 | 「条件が満たされている間」 | 「入力検証」「メニュー表示」 |
break と continue
// break: ループを完全に抜ける
int i = 0;
while (true) {
if (i >= 5) break; // ← ここでループ終了
System.out.println(i);
i++;
}
// continue: 残りをスキップして次の反復へ
int j = 0;
while (j < 10) {
j++;
if (j % 2 == 0) continue; // 偶数はスキップ
System.out.println(j); // 1, 3, 5, 7, 9
}
// ラベル付き break: ネストしたループを一括脱出
outer:
while (true) {
while (true) {
if (found()) break outer; // ★ outer まで一気に抜ける
}
}
無限ループ
サーバの待ち受け、ゲームループ、リアルタイム処理などで使われる重要パターン。必ず脱出条件と CPU 休止を入れます。
// ❌ 危険: CPU 100% でブン回る
while (true) {
if (queue.isEmpty()) continue; // タイトループ
process(queue.poll());
}
// ✅ ブロッキングキューを使う(busy-wait しない)
while (!Thread.currentThread().isInterrupted()) {
try {
Task task = queue.take(); // 要素が来るまでブロック
process(task);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
break;
}
}
// ✅ Thread.sleep で休止(ポーリング)
while (running) {
if (shouldShutdown()) break;
poll();
try {
Thread.sleep(100); // 100ms 休む
} catch (InterruptedException e) {
break;
}
}
Iterator + while パターン
Collection を hasNext() で巡回する古典的な書き方。巡回中に要素を削除するときに必須です。
List<Integer> list = new ArrayList<>(List.of(1, 2, 3, 4, 5));
// ❌ for-each で remove はできない (ConcurrentModificationException)
for (Integer n : list) {
if (n % 2 == 0) list.remove(n); // 実行時例外
}
// ✅ Iterator + while で安全に削除
Iterator<Integer> it = list.iterator();
while (it.hasNext()) {
Integer n = it.next();
if (n % 2 == 0) {
it.remove(); // ★ Iterator.remove なら安全
}
}
System.out.println(list); // [1, 3, 5]
// Java 8+ では removeIf を使う方が簡潔
list.removeIf(n -> n % 2 == 0);
// ファイル読み取りも while + hasNext のパターン
Scanner sc = new Scanner(new File("input.txt"));
while (sc.hasNextLine()) {
String line = sc.nextLine();
process(line);
}
sc.close();
// BufferedReader でも同じ
BufferedReader br = new BufferedReader(new FileReader("input.txt"));
String line;
while ((line = br.readLine()) != null) {
process(line);
}
while と for の使い分け
| シーン | 推奨 | 理由 |
|---|---|---|
| 回数が決まっている (0〜N-1) | for | 初期化・条件・更新が一箇所 |
| 条件次第で回数が変わる | while | シンプル |
| 無限ループ | while(true) / for(;;) | 慣習 |
| Iterator 巡回 | for-each (or while) | 記述短く安全 |
| 巡回中に削除する | while + Iterator | ConcurrentModificationException 回避 |
| 最低 1 回実行 | do-while | 条件判定が後 |
性能
JIT 最適化により、while と for に性能差はほぼ無しです。ループ内の処理(メソッド呼び出し / GC 圧迫 / autoboxing)の方が遥かに影響大。
// ❌ autoboxing 大量発生 → 遅い
long sum = 0L;
Long i = 0L; // Long (Object)
while (i < 1_000_000L) {
sum += i; // Long → long に unbox
i++; // long → Long に box
}
// ✅ プリミティブ long
long sum2 = 0L;
long j = 0L;
while (j < 1_000_000L) {
sum2 += j;
j++;
}
// → 10 倍以上の差が出ることも
PHP / Python の while と比較
// PHP
$i = 0;
while ($i < 5) {
echo $i;
$i++;
}
// do-while
do {
$line = fgets(STDIN);
} while ($line !== false);
// PHP 独自: while-endwhile(テンプレ向け)
while ($i < 5):
echo $i;
$i++;
endwhile;
// 無限ループは true でもよいし 1 でもよい(PHP 緩い)
while (true) { ... }
while (1) { ... }# Python
i = 0
while i < 5:
print(i)
i += 1
# do-while は無い → break で代用
while True:
line = input()
if line == 'quit':
break
# while-else: ループが break されずに終了した場合だけ else が走る
n = 7
i = 2
while i * i <= n:
if n % i == 0:
print('not prime')
break
i += 1
else:
print('prime') # break で抜けなかったときだけ実行
例外安全とリソース解放
// ❌ 例外で resource が閉じられない
BufferedReader br = new BufferedReader(new FileReader("data.txt"));
String line;
while ((line = br.readLine()) != null) {
process(line); // ★ ここで例外 → br.close() されない
}
br.close();
// ✅ try-with-resources
try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))) {
String line;
while ((line = br.readLine()) != null) {
process(line);
}
} // 例外有無に関わらず close される
典型的なバグ
- 条件更新忘れ:
while (i < 10) { ... }内でi++忘れ → 無限ループ - off-by-one:
<と<=の取り違え → 1 件多い / 少ない - 浮動小数の条件:
while (x != 1.0)は等値比較で永遠に終わらないことがある → 誤差許容で書く - busy-wait: 無限ループ + sleep 無し → CPU 100%
- InterruptedException を握りつぶす → スレッドが終了しない
FAQ
Q: while(true) と for(;;) はどちらが速い?
A: 同じバイトコードに最適化されます。好みで OK。while(true) の方が読みやすいという人が多い。
Q: ラベル付き continue はある?
A: あります。continue outer; で外側ループの次の反復へ進めます。break と同様。
Q: while で配列を巡回するのと for-each の違い
A: for-each は内部で Iterator を生成。性能差はほぼ無し(配列の場合は普通の index-for が最速)。可読性は for-each が上。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページ
子ページはありません
同階層のページ
- 条件分岐 (if文)
- 繰り返し処理(while文)
- 繰り返し処理
- 繰り返しの中断 (break)
- 繰り返しのスキップ (continue)
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?