《Thinking in Java》讀書筆記---控制執行流程

? ? ? ? 就像有感知的生物一樣,程序必須在執行過程中控制它的世界,并做出選擇。在Java中,你要使用執行控制語句來作出選擇。


一、流程控制基礎概念

1.1 流程控制的重要性

????????流程控制結構決定了程序執行的順序和邏輯分支,是編程語言中最基礎也是最重要的組成部分。Java繼承了C/C++的大多數流程控制結構,但去除了一些容易出錯的部分(如goto語句),并增加了一些安全性檢查。

1.2 Java中的流程控制分類

????????Java中的流程控制主要分為三類:

  1. 條件語句:if-else, switch-case

  2. 循環語句:while, do-while, for, 增強for循環

  3. 流程中斷語句:break, continue, return


二、條件語句

2.1 if-else語句

????????if-else是最基礎的條件分支結構,語法如下:

if (布爾表達式) {// 表達式為true時執行
} else {// 表達式為false時執行
}
2.1.1 多條件分支

????????可以嵌套使用if-else實現多條件分支:

if (condition1) {// condition1為true時執行
} else if (condition2) {// condition2為true時執行
} else {// 其他情況執行
}
2.1.2 注意事項
  • 布爾表達式必須返回boolean類型(與C/C++不同,不能使用數值)

  • 即使只有一條語句,也建議使用花括號(提高可讀性和避免錯誤)

  • else與最近的if匹配

2.2 switch語句

????????switch用于多值選擇,語法如下:????????

switch (表達式) {case 值1:// 代碼塊1break;case 值2:// 代碼塊2break;default:// 默認代碼塊
}
2.2.1 switch特性
  • 表達式類型可以是:

    • 基本類型:byte, short, char, int

    • 包裝類:Byte, Short, Character, Integer

    • 枚舉類型

    • String(Java 7+)

  • case值必須是編譯時常量

  • 需要break語句防止"貫穿"(fall-through)現象

  • default分支是可選的

2.2.2 Java 12+的switch表達式

????????Java 12引入了更簡潔的switch表達式語法:

int numLetters = switch (day) {case MON, FRI, SUN -> 6;case TUE -> 7;case THU, SAT -> 8;case WED -> 9;default -> throw new IllegalStateException();
};

三、循環語句

3.1 while循環

????????while循環在條件為真時重復執行代碼塊:

while (布爾表達式) {// 循環體
}
3.1.1 注意事項
  • 循環體可能一次都不執行(先檢查條件)

  • 需要確保循環條件最終會變為false,否則會導致無限循環

  • 循環體內通常應修改影響循環條件的變量

3.2 do-while循環

????????do-while循環先執行一次循環體,再檢查條件:

do {// 循環體
} while (布爾表達式);
3.2.1 與while的區別
  • 循環體至少執行一次

  • 分號不能省略

3.3 for循環

????????for循環提供了更緊湊的循環語法:

for (初始化; 布爾表達式; 步進) {// 循環體
}
3.3.1 for循環執行流程
  1. 執行初始化表達式(僅一次)

  2. 檢查布爾表達式:

    • 如果為true,執行循環體

    • 如果為false,退出循環

  3. 執行步進表達式

  4. 重復步驟2-3

3.3.2 特殊形式
  • 可以省略初始化、布爾表達式或步進(但分號不能省略)

  • 可以在初始化部分聲明多個變量(類型相同)

  • 可以在初始化部分使用已有變量

for (int i = 0, j = 10; i < j; i++, j--) {System.out.println(i + " " + j);
}

3.4 增強for循環(for-each)

????????Java 5引入的增強for循環簡化了數組和集合的遍歷:

for (元素類型 變量名 : 數組或集合) {// 使用變量名訪問元素
}
3.4.1 特點
  • 更簡潔的語法

  • 避免使用顯式索引

  • 不能修改原數組/集合元素(對于基本類型數組)

  • 不能獲取當前索引

3.4.2 實現原理

????????增強for循環對數組和Iterable接口的實現類處理方式不同:

  • 數組:編譯為基于索引的標準for循環

  • Iterable:使用iterator()方法獲取迭代器


四、流程中斷語句

4.1 break

????????break用于:

  1. 退出switch語句的case塊

  2. 提前終止循環

4.1.1 帶標簽的break

????????Java支持標簽(label)語法,可以跳出多層嵌套循環:

outer:
for (int i = 0; i < 10; i++) {for (int j = 0; j < 10; j++) {if (i * j > 50) {break outer;  // 跳出外層循環}}
}

4.2 continue

????????continue跳過當前循環的剩余部分,直接開始下一次循環:

for (int i = 0; i < 10; i++) {if (i % 2 == 0) {continue;  // 跳過偶數}System.out.println(i);
}
4.2.1 帶標簽的continue

????????類似break,continue也可以使用標簽:

outer:
for (int i = 0; i < 10; i++) {for (int j = 0; j < 10; j++) {if (j > i) {continue outer;  // 跳到外層循環的下一次迭代}System.out.println(i + " " + j);}
}

4.3 return

????????return用于從方法中返回:

  1. 無返回值方法:直接返回

  2. 有返回值方法:返回指定值

public int max(int a, int b) {if (a > b) {return a;}return b;
}

五、特殊流程控制

5.1 嵌套循環

????????循環可以多層嵌套,但應注意:

  • 嵌套層次不宜過深(通常不超過3層)

  • 內層循環應盡可能簡單

  • 考慮使用帶標簽的break/continue簡化控制

5.2 遞歸

????????方法可以調用自身,形成遞歸:

public int factorial(int n) {if (n <= 1) {return 1;}return n * factorial(n - 1);
}
5.2.1 遞歸注意事項
  • 必須有終止條件

  • 每次遞歸應使問題規模減小

  • Java默認的調用棧深度有限(可通過-Xss參數調整)

  • 遞歸可能比迭代效率低


六、Java與C/C++流程控制的區別

  1. 布爾表達式:Java必須使用boolean類型,不能使用數值

  2. goto語句:Java沒有goto,但標簽+break/continue可以實現類似功能

  3. for循環變量作用域:Java可以在for初始化部分聲明變量,作用域限于循環

  4. 增強for循環:Java特有的簡化語法

  5. switch語句

    • Java 7+支持String

    • case值必須是編譯時常量

    • 必須有break防止貫穿(除非有意為之)


七、最佳實踐與常見陷阱

7.1 最佳實踐

  1. 代碼塊始終使用花括號:即使只有一條語句

  2. switch語句始終包含default分支:處理未預期的值

  3. 避免深層嵌套:使用方法提取或提前返回簡化邏輯

  4. 循環條件應明顯可見:避免隱藏的無限循環

  5. 優先使用增強for循環:當不需要索引時

7.2 常見陷阱

  1. if語句缺少花括號

    if (condition)statement1;statement2;  // 無論condition如何都會執行
  2. switch貫穿問題

    switch (x) {case 1: System.out.println("1");case 2: System.out.println("2");  // 當x=1時也會執行
    }
  3. 浮點數比較

    for (double d = 0.1; d != 1.0; d += 0.1) {// 可能因浮點精度問題導致無限循環
    }
  4. 修改增強for循環的集合

    for (String s : list) {list.remove(s);  // 拋出ConcurrentModificationException
    }

八、現代Java中的流程控制改進

8.1 Java 14的switch表達式(正式版)

????????Java 14使switch表達式成為正式特性:

int numLetters = switch (day) {case MON, FRI, SUN -> 6;case TUE -> 7;case THU, SAT -> 8;case WED -> {System.out.println("Wednesday");yield 9;  // 使用yield返回值}default -> 0;
};

8.2 模式匹配(預覽特性)

????????Java 14+引入了模式匹配的預覽特性:

// instanceof模式匹配(Java 16正式)
if (obj instanceof String s) {System.out.println(s.length());  // 直接使用s
}// switch模式匹配(預覽)
switch (obj) {case Integer i -> System.out.println("Integer: " + i);case String s -> System.out.println("String: " + s);default -> System.out.println("Other");
}

九、foreach設計哲學

9.1 設計目標

  1. 簡化迭代語法:隱藏迭代器細節

  2. 統一訪問方式:數組和集合使用相同語法

  3. 減少錯誤:避免越界和修改異常

9.2?foreach修改集合問題

List<String> list = new ArrayList<>();
// 錯誤方式(拋出ConcurrentModificationException)
for (String s : list) {if (s.equals("remove")) list.remove(s);
}// 正確方式1:使用迭代器
Iterator<String> it = list.iterator();
while (it.hasNext()) {if (it.next().equals("remove")) it.remove();
}// 正確方式2:Java 8+ removeIf
list.removeIf(s -> s.equals("remove"));

9.3?多維數組遍歷優化

// 低效方式(多次數組訪問)
for (int i = 0; i < matrix.length; i++) {for (int j = 0; j < matrix[i].length; j++) {sum += matrix[i][j];}
}// 高效方式(緩存行數組)
for (int[] row : matrix) {for (int val : row) {sum += val;}
}

結語:通過深入理解這些流程控制機制,我們可以編寫出更高效、更健壯的Java代碼,同時為適應Java語言的持續演進做好準備。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/92231.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/92231.shtml
英文地址,請注明出處:http://en.pswp.cn/web/92231.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

極驗 G-star 人才特訓營:為業務安全領域培養下一代新興力量

本文導讀 極驗為什么要啟動 G-star 實習生培養計劃&#xff1f;50多位來自多所高校的同學&#xff0c;在極驗經歷了一場怎樣的“非典型”實習&#xff1f;技術大咖親授&#xff0c;先培訓再實戰&#xff0c;極驗打造的是怎樣的人才體系&#xff1f;同學有話說&#xff1a;培養計…

攻防世界-web-csaw-mfw

一.題目分析這邊提示使用了Git&#xff0c;試著訪問.git看是否存在.git泄露瀏覽了一下&#xff0c;很多都是亂碼&#xff0c;想著用githack將git庫克隆下看一下二.操作python2 GitHack.py http://url/.git訪問了一下flag.php&#xff0c;沒啥發現&#xff0c;在看一下index.php…

202506 電子學會青少年等級考試機器人四級實際操作真題

更多內容和歷年真題請查看網站&#xff1a;【試卷中心 -----> 電子學會 ----> 機器人技術 ----> 四級】 網站鏈接 青少年軟件編程歷年真題模擬題實時更新 2025年6月 青少年等級考試機器人實操真題四級 實際操作 主題&#xff1a;感應節能燈&#xff08;四級&am…

DLT645電表數據 保存到MySQL數據庫項目案例

目錄 1 案例說明 2 VFBOX網關工作原理 3 準備工作 4 配置VFBOX網關采集DLT645電表數據 5 網關寫數據到MYSQL數據庫 6 安裝MYSQL數據庫 7 其他說明 8 案例總結 1 案例說明 設置網關采集DLT645電表數據數據把采集的數據保存到MySQL數據庫。 2 VFBOX網關工作原理 VFBOX網關…

Redux與React - 異步狀態操作(React快速上手4)

異步操作樣板代碼1. 創建store的寫法保持不變&#xff0c;配置好同步修改狀態的方法 2. 單獨封裝一個函數&#xff0c;在函數內部return一個新函數&#xff0c;在新函數中 2.1 封裝異步請求獲取數據 2.2 調用同步actionCreater傳入異步數據生成一個action對象&#xff0c;并使用…

win10桌面右鍵沒有新建word

win10右鍵新建word不見解決方法1、點擊開始&#xff0c;找到運行命令行&#xff0c;輸入regedit&#xff0c;打開注冊表。2、在左側找到HKEY_CLASSES_ROOT目錄&#xff0c;并展開。3.找到.docx 雙擊&#xff08;默認&#xff09;一項&#xff0c;將其改為 Word.Document.12。關…

Docker國內可用鏡像(2025.08.06測試)

Docker渡渡鳥鏡像可用&#xff08;測試時間2025.08.06&#xff09;https://docker.aityp.com/使用渡渡鳥鏡像pull ollama latest 例子&#xff1a;docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/ollama/ollama:0.10.1毫秒鏡像和軒轅鏡像也可用&#xff0c;但…

決策樹的實際案例

決策樹作為一種直觀、易解釋的機器學習算法&#xff0c;在金融、醫療、電商、風控等多個領域都有廣泛的實際應用。以下將講解1個典型案例&#xff1a;貸款違約預測。對于貸款違約預測&#xff0c;即在貸款人員在貸款之前對其進行預測&#xff0c;通過他的眾多特征情況判別是否可…

bool 類型轉換運算符重載

以下是一個極簡且聚焦核心知識點的示例代碼&#xff0c;用最直觀的方式演示 bool 類型轉換運算符重載的觸發邏輯、使用場景和避坑點&#xff0c;幫你快速掌握&#xff1a;cpp運行#include <iostream> using namespace std;// 核心類&#xff1a;演示 bool 轉換運算符 cla…

LVGL代碼框架簡介

LVGL代碼框架介紹LVGL&#xff08;Light and Versatile Graphics Library&#xff09;是一個輕量級、功能強大的嵌入式圖形庫。其代碼架構設計清晰&#xff0c;模塊化程度高。1. 整體架構層次LVGL采用分層架構設計&#xff0c;主要包含以下幾個層次&#xff1a;┌───────…

【云計算】云主機的親和性策略(三):云主機 宿主機

《云主機的親和性策略》系列&#xff0c;共包含以下文章&#xff1a; 1?? 云主機的親和性策略&#xff08;一&#xff09;&#xff1a;快樂旅行團2?? 云主機的親和性策略&#xff08;二&#xff09;&#xff1a;集群節點組3?? 云主機的親和性策略&#xff08;三&#xf…

【世紀龍科技】虛擬技術助力職教汽車自動變速器拆裝虛擬實訓軟件

在職業院校汽車專業實訓課堂上&#xff0c;教師常面臨這樣的兩難&#xff1a;學生圍在昂貴的自動變速器實物旁&#xff0c;卻因設備數量有限只能輪流操作&#xff1b;拆裝步驟稍有偏差便可能損壞精密部件&#xff0c;維修成本讓本就緊張的教學經費雪上加霜&#xff1b;傳統教學…

[LVGL] 配置lv_conf.h | 條件編譯 | 顯示屏lv_display

鏈接&#xff1a;https://docs.lvgl.io/master/ docs&#xff1a;LVGL LVGL&#xff08;Light and Versatile Graphics Library&#xff09;是用于在資源受限的嵌入式系統上創建圖形用戶界面&#xff08;GUI&#xff09;的開源解決方案。 它提供豐富的控件和靈活的**事件系…

sqli-labs通關筆記-第32關 GET寬字符注入(單引號閉合 手工注入+腳本注入兩種方法)

目錄 一、寬字符注入 二、代碼審計 1、代碼審計 2、SQL注入安全性分析 三、滲透實戰 1、進入靶場 2、id1探測 3、id%df-- 探測 4、手工注入 &#xff08;1&#xff09;獲取列數 &#xff08;2&#xff09;獲取回顯位 &#xff08;3&#xff09;獲取數據庫名 &…

MySQL的創建管理表:

目錄 基礎知識&#xff1a; 一條數據存儲的過程&#xff1a; 標識符命名規則&#xff1a; 創建和管理數據庫&#xff1a; 創建數據庫&#xff1a; 創建數據庫&#xff1a; 創建數據庫并指定字符集&#xff1a; 判斷數據庫是否存在&#xff0c;不存在則創建數據庫&#…

Linux Vi常用指令總結

Vi&#xff08;及其改進版 Vim&#xff09;是 Linux 中常用的文本編輯器&#xff0c;雖然入門有一定門檻&#xff0c;但熟練掌握后效率極高。以下是常見指令分類整理&#xff1a;1. 模式切換 普通模式&#xff08;命令模式&#xff09;&#xff1a;啟動后的默認模式&#xff0c…

解決遠程連接云服務器mysql編號1130問題

連接云服務器mysql失敗&#xff0c;可能是因為ip發生改變&#xff0c;被mysql攔截。我自己前后做了兩件事。大家趕時間可直接從二開始&#xff0c;不放心的就從一開始到結束一、在云服務器實例中為當前ip配置安全組權限。1.找到當前服務器的實例&#xff0c;進入安全組。為其增…

大數據存儲域——HDFS存儲系統

摘要本文介紹了HDFS存儲系統&#xff0c;包括其組件、工作機制、實戰經驗總結、使用場景以及與SpringBoot的實戰示例和優化設計。HDFS由Client、NameNode、SecondaryNameNode、DataNode等組件構成&#xff0c;通過特定的工作機制實現文件的讀取和寫入。它適用于多種場景&#x…

jdk動態代理如何實現

口語化答案好的&#xff0c;面試官。jdk 的動態代理主要是依賴Proxy類 和InvocationHandler 接口。jdk 動態代理要求類必須有接口。在進行實現的時候&#xff0c;首先要定義接口&#xff0c;比如MyService&#xff0c;這個接口就是我們的正常功能的實現。但是希望在不更改MySer…

自然語言處理的相關概念與問題

目錄 一、學科的產生與發展 1、什么是自然語言&#xff1f; 2、自然語言處理技術的誕生 二、技術挑戰 三、基本方法 1、方法概述 理性主義方法 經驗主義方法 2、傳統的統計學習方法 3、深度學習方法 詞向量表示 詞向量學習 開源工具 四、應用舉例 1、漢語分詞 …