Java while和do...while循環(huán)的使用方式
Java while與do…while循環(huán)
一、核心機(jī)制對(duì)比
| 特性 | while 循環(huán) | do…while 循環(huán) |
|---|---|---|
| 執(zhí)行順序 | 先判斷條件 → 后執(zhí)行循環(huán)體 | 先執(zhí)行循環(huán)體 → 后判斷條件 |
| 最少執(zhí)行次數(shù) | 0次(條件初始為false時(shí)) | 1次(無論初始條件如何) |
| 語法結(jié)構(gòu) | while(condition) { ... } | do { ... } while(condition); |
| 適用場(chǎng)景 | 不確定執(zhí)行次數(shù)的條件驅(qū)動(dòng)型循環(huán) | 必須至少執(zhí)行一次的初始化/校驗(yàn)場(chǎng)景 |
二、標(biāo)準(zhǔn)語法規(guī)范
基礎(chǔ)結(jié)構(gòu)
// while循環(huán)
while (布爾表達(dá)式) {
// 循環(huán)體
}
// do...while循環(huán)
do {
// 循環(huán)體
} while (布爾表達(dá)式); // 注意結(jié)尾分號(hào)
流程控制要點(diǎn)
- 兩種循環(huán)均支持
break(立即終止)和continue(跳過本次剩余代碼) - 不可在條件表達(dá)式中聲明變量(與for循環(huán)不同)
三、典型應(yīng)用場(chǎng)景
while 循環(huán)最佳實(shí)踐
// 文件逐行讀取
BufferedReader reader = new FileReader("data.txt");
String line;
while ((line = reader.readLine()) != null) {
process(line);
}
// 事件監(jiān)聽循環(huán)
while (!shutdownRequested()) {
handleEvents();
}
do…while 獨(dú)特價(jià)值
// 用戶輸入驗(yàn)證(必須至少執(zhí)行一次)
Scanner scanner = new Scanner(System.in);
int input;
do {
System.out.print("請(qǐng)輸入1-100之間的數(shù)字:");
input = scanner.nextInt();
} while (input < 1 || input > 100);
// 數(shù)據(jù)庫連接重試機(jī)制
Connection conn;
int retries = 0;
do {
conn = tryConnect();
retries++;
} while (conn == null && retries < 3);
四、常見錯(cuò)誤防范
無限循環(huán)陷阱
int count = 0;
while (count < 5) {
// 缺少count++ → 死循環(huán)
}
do {
// ...
} while (true); // 沒有退出條件的硬編碼
空語句風(fēng)險(xiǎn)
while (condition); // 危險(xiǎn)的分號(hào)!循環(huán)體為空
{
System.out.println("這段代碼不會(huì)循環(huán)執(zhí)行!");
}
作用域問題
do {
int temp = calculate(); // temp僅在循環(huán)體內(nèi)可見
} while (temp > 0); // 編譯錯(cuò)誤:找不到符號(hào)
五、性能優(yōu)化建議
循環(huán)條件優(yōu)化
// 低效寫法(每次循環(huán)都調(diào)用size())
while (i < list.size()) { ... }
// 優(yōu)化方案(緩存長度值)
int length = list.size();
while (i < length) { ... }
循環(huán)展開策略
// 常規(guī)循環(huán)
while (n > 0) {
process(n--);
}
// 手動(dòng)展開提升性能(適用于大循環(huán)次數(shù))
while (n >= 4) {
process(n--); process(n--);
process(n--); process(n--);
}
while (n > 0) process(n--);
六、與其他循環(huán)結(jié)構(gòu)對(duì)比
| 循環(huán)類型 | 優(yōu)勢(shì) | 劣勢(shì) | 典型用例 |
|---|---|---|---|
| while | 靈活處理未知次數(shù)循環(huán) | 可能零次執(zhí)行 | 事件驅(qū)動(dòng)、流數(shù)據(jù)處理 |
| do…while | 保證首次執(zhí)行 | 語法易錯(cuò)(結(jié)尾分號(hào)) | 輸入校驗(yàn)、重試機(jī)制 |
| for | 明確控制迭代次數(shù) | 結(jié)構(gòu)相對(duì)固定 | 數(shù)組/集合遍歷、計(jì)數(shù)循環(huán) |
| 增強(qiáng)for循環(huán) | 簡化集合遍歷 | 無法修改集合結(jié)構(gòu) | 只讀遍歷操作 |
七、底層實(shí)現(xiàn)原理
字節(jié)碼層面
- while與do…while編譯后均使用條件跳轉(zhuǎn)指令
- 關(guān)鍵區(qū)別在于
goto指令位置:
// while等效結(jié)構(gòu)
label:
if (!condition) goto end
loopBody
goto label
end:
// do...while等效結(jié)構(gòu)
label:
loopBody
if (condition) goto label
JIT優(yōu)化特征
- 熱點(diǎn)循環(huán)可能被編譯為機(jī)器碼展開
- 邊界檢查消除(Bound Check Elimination)優(yōu)化
擴(kuò)展知識(shí):Java 17引入的模式匹配可與循環(huán)結(jié)合:
Object[] objs = {1, "text", 3.14};
int i = 0;
while (i < objs.length) {
if (objs[i] instanceof Integer num) {
System.out.println("整數(shù):" + num);
}
i++;
}
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java多態(tài)實(shí)現(xiàn)電子寵物系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java多態(tài)實(shí)現(xiàn)電子寵物系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
Apache?SkyWalking?監(jiān)控?MySQL?Server?實(shí)戰(zhàn)解析
這篇文章主要介紹了Apache?SkyWalking?監(jiān)控?MySQL?Server?實(shí)戰(zhàn)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
JAVA中跳出當(dāng)前多重嵌套循環(huán)的方法詳解
今天在看面試題時(shí),發(fā)現(xiàn)了這個(gè)問題,因?yàn)樵赑HP中跳出多次循環(huán)可以使用break數(shù)字來跳出多層循環(huán),但這在java中并不好使,這篇文章主要給大家介紹了關(guān)于JAVA中跳出當(dāng)前多重嵌套循環(huán)的相關(guān)資料,需要的朋友可以參考下2022-01-01
Springboot關(guān)于自定義stater的yml無法提示問題解決方案
這篇文章主要介紹了Springboot關(guān)于自定義stater的yml無法提示問題及解決方案,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06
dubbo擴(kuò)展點(diǎn)AOP切面功能擴(kuò)展示例詳解
這篇文章主要為大家介紹了dubbo擴(kuò)展點(diǎn)AOP切面功能擴(kuò)展示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
Java 實(shí)現(xiàn)repalceAll只替換第二個(gè)匹配到的字符串
這篇文章主要介紹了Java 實(shí)現(xiàn)repalceAll只替換第二個(gè)匹配到的字符串,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12

