程序 = 數據結構 + 算法。流程控制是算法的骨架,數組是最基礎的容器數據結構。本文系統講解 Java 三大基本流程結構、循環控制語句、數組聲明/初始化/訪問/內存模型/多維數組/工具類,並附大量代碼示例與常見錯誤避坑。
// 單分支
if (condition) { statements; }
// 雙分支
if (condition) { statements; } else { statements; }
// 多分支
if (cond1) { } else if (cond2) { } ... else { }
⚠️ 常見邏輯錯誤:條件順序顛倒
int age = 45;
// 錯誤寫法:先判斷 age>20,45 滿足,打印「青年人」,後續 else if 不再執行
if (age > 20) { println("青年人"); }
else if (age > 40) { println("中年人"); } // 永遠執行不到
else if (age > 60) { println("老年人"); }
// 正確寫法:範圍從大到小 / 互斥區間
if (age > 60) { println("老年人"); }
else if (age > 40) { println("中年人"); }
else if (age > 20) { println("青年人"); }
隱含條件原理:`else` 代表「前面所有條件都不成立」。`else if (age > 40)` 實際邏輯是 `age > 40 && !(age > 60)`。
// 傳統 switch (JDK 12 前)
switch (score) {
case 'A': println("優秀"); break;
case 'B': println("良好"); break;
default: println("錯誤");
}
// JDK 12+ Switch 表達式 (箭頭語法,無 break 穿透)
String result = switch (season) {
case "春天" -> "春暖花開";
case "夏天" -> "夏日炎炎";
default -> "未知季節";
};
⚠️ 穿透陷阱:漏寫 `break` 導致繼續執行下一 case。JDK 12+ 箭頭語法默認無穿透。
| 循環類型 | 語法結構 | 執行順序 | 特點 | 適用場景 |
|---|---|---|---|---|
| while | `init; while(cond) { body; iter; }` | 先判斷 → 體 → 迭代 → 判斷... | 次數未知、可能零次 | 讀取流、輪詢條件 |
| do-while | `init; do { body; iter; } while(cond);` | 體 → 判斷 → 體... | 至少執行一次 | 菜單交互、至少一次嘗試 |
| for | `for(init; cond; iter) { body }` | init → 判斷 → 體 → iter → 判斷... | 次數已知、計數器明確 | 遍歷數組/集合、固定次數 |
| foreach | `for(E e : coll) {}` | 自動迭代 | 簡潔、只讀遍歷 | 遍歷集合/數組 (不需索引) |
| 關鍵字 | 作用 | 作用範圍 |
|---|---|---|
| break | 完全結束當前循環 / switch | 可帶標籤 `label:` 結束外層循環 |
| continue | 結束本次循環,進入下一次迭代 | 可帶標籤跳過外層循環本次 |
| return | 結束整個方法 | 跨越任意層循環直接返回 |
// 定義 (推薦格式)
int[] arr; // 類型[] 變量名
// 或
int arr[]; // 類型 變量名[] (C 風格,不推薦)
// 靜態初始化 (指定元素,長度由系統推導)
int[] a = {5, 6, 7, 9};
int[] b = new int[] {5, 6, 7, 9};
// 動態初始化 (指定長度,元素獲取默認值: 0/null/false)
int[] prices = new int[5]; // {0,0,0,0,0}
String[] books = new String[4]; // {null,null,null,null}
// 索引訪問
for (int i = 0; i < arr.length; i++) { println(arr[i]); }
// foreach (JDK 5+)
for (int val : arr) { println(val); }
// ⚠️ foreach 中對循環變量賦值 (val = 10) 不會修改數組元素!
基本類型數組:棧變量 → 堆數組對象 → **直接存值**。
引用類型數組:棧變量 → 堆數組對象 → **存引用** → 另一塊堆內存存對象實體。

斷開引用 (`arr = null`) 使數組對象成為垃圾,GC 回收。
// 定義二維數組
int[][] matrix;
// 動態初始化:先定第一維長度
matrix = new int[3][]; // {null, null, null}
// 再逐行初始化第二維 (長度可不一 → 齒狀數組)
matrix[0] = new int[2];
matrix[1] = new int[4];
matrix[2] = new int[1];
// 靜態初始化
String[][] str2 = { new String[3], new String[]{"hello"} };
// 訪問
str2[1][0]; // "hello"
結論:Java **無真正多維數組**,只有「數組的數組」。二維 = 一維數組,元素是一維數組;三維 = 一維數組,元素是二維數組...

int[] a = {3, -4, 25, 16, 30, 18};
Arrays.sort(a); // 雙軸快排 (基本類型) / TimSort (對象)
Arrays.parallelSort(a); // 多線程並行排序 (大數組加速)
Arrays.parallelPrefix(a, (x,y)->x*y); // 並行前綴累積
Arrays.parallelSetAll(new int[5], i -> i*5); // 並行生成
println(Arrays.toString(a)); // 友好輸出 [ -4, 3, 16, 18, 25, 30 ]
println(Arrays.equals(a, b)); // 內容比較
int[] copy = Arrays.copyOf(a, 10); // 擴容復制
代碼示例見原文 `Gobang.java` (二維數組棋盤繪製、控制台交互) 與 `Num2Rmb.java` (浮點數分解、四位分組轉漢字、單位處理)。