流程控制——選擇結(jié)構(gòu)與循環(huán)結(jié)構(gòu)
- 在Java中有3種流程控制結(jié)構(gòu):順序結(jié)構(gòu)料饥、選擇結(jié)構(gòu)恋沃、循環(huán)結(jié)構(gòu)望几。
- 順序結(jié)構(gòu):順序結(jié)構(gòu)是指程序從上向下依次執(zhí)行每條語句結(jié)構(gòu)邓夕,中間沒有任何的判斷和跳轉(zhuǎn)蛀缝。
- 選擇結(jié)構(gòu):選擇結(jié)構(gòu)是根據(jù)條件判斷的結(jié)果來選擇執(zhí)行不同的代碼顷链。選擇結(jié)構(gòu)可以細(xì)分為單分支結(jié)構(gòu)、雙分支結(jié)構(gòu)和多分支結(jié)構(gòu)内斯。Java通過if控制語句蕴潦、switch語句來實(shí)現(xiàn)選擇結(jié)構(gòu)。
- 循環(huán)結(jié)構(gòu):循環(huán)結(jié)構(gòu)是根據(jù)判斷條件來重復(fù)性地執(zhí)行某段代碼俘闯。Java提供了while語句潭苞、do-while語句、for語句來實(shí)現(xiàn)循環(huán)結(jié)構(gòu)真朗。
- if控制語句:if控制語句共有3種不同的形式此疹,分別是單分支結(jié)構(gòu)、雙分支結(jié)構(gòu)和多分支結(jié)構(gòu)
- (1) 使用if語句實(shí)現(xiàn)單分支處理
- if語句的語法格式如下遮婶。
- if(表達(dá)式一定返回true或false){語句分支語句塊}
- if是Java關(guān)鍵字
- 表達(dá)式是爾類型的表達(dá)式蝗碎,其結(jié)果為true或false
- 當(dāng)表達(dá)式返回true時(shí),會(huì)執(zhí)行分支語句塊旗扑,然后在執(zhí)行后續(xù)的程序代碼
- 當(dāng)條件表達(dá)式返回false時(shí)蹦骑,會(huì)跳過分支語句塊,直接執(zhí)行后續(xù)程序代碼臀防。
注意如果分支語句塊中只包含一條語句眠菇,則可以省略花括號(hào)“{}”但禁止這樣書寫程序(循環(huán)也有同樣特點(diǎn)) - 注意以下代碼的問題
if(w=="晴")
;
System.out.println("爬山");//此語句已經(jīng)不是分支結(jié)構(gòu)的一部分了
- (2)if-else分支結(jié)構(gòu)
- 條件成立袱衷,執(zhí)行if塊中的語句捎废,否則,執(zhí)行else塊中的語句
- if與else語句塊是互斥的
- else子句不能單獨(dú)使用致燥,它必須是if語句的一部分登疗,與最近的if語句配對(duì)使用。
if(w=="晴"){
System.out.println("爬山");
}else{
System.out.println("看書")辐益;
}System.out.println("睡覺")断傲;
- (3)if-else if-else分支結(jié)構(gòu)
- 每一個(gè)分支語句塊都是互斥的
if(w=="晴"){
System.out.println("爬山");
}else if(w=="雨"){
System.out.println("看書")
}else if(w=="雪"){
System.out.println("打雪仗");
}else{
System.out.println("發(fā)呆")
}System.out.println("睡覺")
2.switch語句
- switch語句只能進(jìn)行相等性判定(switch后的變量與case后的值進(jìn)行)
- case關(guān)鍵字后的值必須與switch后的變量屬于同一類型(或可自動(dòng)轉(zhuǎn)變?yōu)榇祟愋偷念愋?
- 在同一個(gè)switch語句塊中智政,各case關(guān)鍵字后面的值不能重復(fù)
- switch后的變量是相等判斷的關(guān)鍵因素艳悔。此變量必須是:byte、short女仰、int、char或它們的包裝類對(duì)象抡锈。附:Java5 后可以使用枚舉對(duì)象疾忍。 Java7 后可使用String
- switch語句塊中有1到多個(gè)case塊,用于判斷變量等于什么值時(shí)來執(zhí)行的邏輯
- switch語句塊中有0到1個(gè)default塊床三,其中定義著所有case都不成立時(shí)應(yīng)執(zhí)行的邏輯
- 每個(gè)case塊的最后一條語句通常應(yīng)該使用break結(jié)束一罩,但某些情況下,也可以不寫
- 如果不以break語句結(jié)束case塊撇簿,則會(huì)從第一個(gè)滿足條件的case開始執(zhí)行后續(xù)所有的case塊中的程序邏輯聂渊,直到遇到break或switch塊結(jié)束
- 在相等判斷情況下,switch結(jié)構(gòu)與if-else if-else結(jié)構(gòu)可以相互替代
- 對(duì)于if-else if-else塊四瘫,switch結(jié)構(gòu)的性能更好
switch(month){
case12:
System.out.println("冬季");
break;
case1:
System.out.println("冬季");
break;
case2:
System.out.println("冬季");
break;
case3:
System.out.println("春季");
break;
case4:
System.out.println("春季");
break;
case5:
System.out.println("春季");
break;
case6:
System.out.println("夏季");
break;
case7:
System.out.println("夏季");
break;
case8:
System.out.println("夏季");
break;
case9:
System.out.println("秋季");
break;
case10:
System.out.println("秋季");
break;
case11:
System.out.println("秋季");
break;
default:
System.out.println("請(qǐng)輸入一個(gè)1~12之間的一個(gè)整數(shù)");
break;
} System.out.println("完成");
- 如果連續(xù)多個(gè)case塊中沒有break語句汉嗽,可以把它們合并為一組條件。同類條件會(huì)執(zhí)行相同的語句邏輯
switch(month){
case12:
case1:
case2:
System.out.println("冬季");
break;
case12:
case3:
case4:
case5:
System.out.println("冬季");
break;
case6:
case7:
case8:
System.out.println("冬季");
break;
case9:
case10:
case11:
System.out.println("冬季");
break;
default:
System.out.println("請(qǐng)輸入一個(gè)1~12之間的一個(gè)整數(shù)");
break;
} System.out.println("完成")
- while與do-while循環(huán)
- 語法格式:
- 變量初始化
- while(循環(huán)條件){
- 循環(huán)體}
- 循環(huán)語句的主要作用是反復(fù)執(zhí)行一段代碼找蜜,直到滿足一定條件位置饼暑。可以把循環(huán)分成三個(gè)部分
- 初始部分:設(shè)置循環(huán)初始狀態(tài)
- 循環(huán)體:重復(fù)執(zhí)行的代碼
- 循環(huán)條件:判斷是否繼續(xù)循環(huán)的條件
- 計(jì)數(shù)器聲明一個(gè)用于判斷是否能進(jìn)入循環(huán)的變量
- while循環(huán)體可能執(zhí)行0到多次洗做,原因是先判斷條件弓叛,再執(zhí)行邏輯
- do-while循環(huán)體可能執(zhí)行1到多次,原因是先執(zhí)行邏輯诚纸,再判斷條件
- (循環(huán)條件)是判斷是否可以執(zhí)行循環(huán)體的boolean表達(dá)式撰筷。當(dāng)其為true時(shí),執(zhí)行循環(huán)體畦徘。當(dāng)其為false時(shí)毕籽,跳過循環(huán)體,執(zhí)行后續(xù)代碼
- 訊話題中的邏輯旧烧,改變是否進(jìn)入循環(huán)體的條件取值影钉,變更進(jìn)入循環(huán)體的條件如果缺失或錯(cuò)誤,則會(huì)出現(xiàn)死循環(huán)
n++;
System.out.println(n);
以上兩句可以合并為
System.out.println(n++);
- for循環(huán)
- 各種循環(huán)結(jié)構(gòu)的使用場(chǎng)景
- while和dowhile:在循環(huán)次數(shù)不定的場(chǎng)景下使用
- for:在循環(huán)次數(shù)可知的場(chǎng)景下使用
- forEach:用于遍歷數(shù)組或容器對(duì)象中的元素
- 格式:for(聲明計(jì)數(shù)器初值;進(jìn)入循環(huán)的boolean表達(dá)式;修改計(jì)數(shù)器值){循環(huán)邏輯}
- 第一步:初始化計(jì)數(shù)器掘剪,此部分執(zhí)行一次
- 第二步:判斷是否可以進(jìn)入循環(huán)
- 第三步:如果可以進(jìn)入循環(huán)平委,則執(zhí)行其中邏輯,否則跳過循環(huán)體
- 第四步:當(dāng)循環(huán)體執(zhí)行完成后夺谁,進(jìn)行計(jì)數(shù)器的修改
- 第五步:跳轉(zhuǎn)到第二步廉赔,開始下一次循環(huán)周期
for(int i = 1;i<11;i++){
System.out.println(i);
}System.out.println("Boom~~~");
for 循環(huán)的多重循環(huán)嵌套樣例
for(int i =1; i<=10 ;i++){
for(int j = 1;j<=i;j++){
System.out.println(j+"*"+i+"="+(j*i));
System.out.print("/t");
}System.out.println();
}
- forEach循環(huán) 遍歷數(shù)組
- 傳統(tǒng)方式是使用數(shù)組元素的索引進(jìn)行數(shù)組元素的遍歷的(其中i是元素的索引值)
int []arr={10,20,30,40,50,60,70,80,90,100};
for(int i = 0;i<arr.lengthe;i++);
System.out.println(arr[i]);
- Java5 后一如的forEach循環(huán)語法(增強(qiáng)for循環(huán))
- 格式:for(元素類型聲明 當(dāng)前元素的變量名;待遍歷的數(shù)組或容器對(duì)象){
循環(huán)體} - 進(jìn)入forEach循環(huán)肉微,會(huì)從被遍歷的數(shù)組對(duì)象的第一個(gè)元素開始處理,每次循環(huán)蜡塌,處理一個(gè)元素碉纳,這個(gè)元素被element變量持有。與傳統(tǒng)for循環(huán)遍歷數(shù)組不同馏艾,此處的element不是索引劳曹,而是元素本身的值。當(dāng)數(shù)組的所有元素被遍歷完成后琅摩,循環(huán)結(jié)束铁孵。forEach循環(huán)不會(huì)出現(xiàn)數(shù)組索引越界異常。相對(duì)于傳統(tǒng)的for循環(huán)遍歷數(shù)組房资,forEach更安全
for(int element:arr){
System.out.println(element);
}
跳轉(zhuǎn)語句
- break語句
- break語句在循環(huán)中的作用是終止當(dāng)前循環(huán)蜕劝。
import java.util.Random;
// 隨機(jī)生成0~9之間的整數(shù),但當(dāng)出現(xiàn)5時(shí)停止輸出轰异。
public class BreakDemo001 {
public static void main(String[] args) {
// [0, 1)
double r1 = Math.random();
Random random = new Random();
boolean b1 = random.nextBoolean();
while (true) {
// [0, n)
int int1 = random.nextInt(10);
if (int1 == 5) {
// 終止循環(huán)岖沛,跳轉(zhuǎn)到循環(huán)體之外的語句
// 通常會(huì)使用在分支結(jié)構(gòu)中,即當(dāng)滿足某條件時(shí)才觸發(fā)
break;
}
System.out.println(int1);
}
System.out.println("5了~~~");
}
}
- continue語句
- continue語句的作用是強(qiáng)制循環(huán)提前返回搭独,也就是讓循環(huán)跳過本次循環(huán)中的剩余代碼婴削,然后開始下一次循環(huán)。
// 輸出1~100之間的數(shù)字戳稽,但不包含7的倍數(shù)馆蠕。
public class ContinueDemo001 {
public static void main(String[] args) {
for (int i = 1; i <= 100; i++) {
if (i % 7 == 0) {
// 終止本次循環(huán),開始下一次循環(huán)
// 在本次循環(huán)中惊奇,會(huì)跳過后續(xù)所有循環(huán)體中的語句
// 通常會(huì)使用在分支結(jié)構(gòu)中互躬,即當(dāng)滿足某條件時(shí)才觸發(fā)
continue;
}
System.out.println(i);
}
}
}
- return語句
- return語句的作用是結(jié)束當(dāng)前方法的執(zhí)行并退出返回到調(diào)用該方法的語句處。
import java.util.Random;
// 隨機(jī)生成0~9之間的整數(shù)颂郎,但當(dāng)出現(xiàn)5時(shí)停止輸出吼渡。
public class ReturnDemo001 {
public static void main(String[] args) {
Random random = new Random();
while (true) {
int int1 = random.nextInt(10);
if (int1 == 5) {
// return是方法的正常結(jié)束的出口
// 一旦執(zhí)行了return,則所在方法的執(zhí)行就結(jié)束了
// 通常會(huì)在分支結(jié)構(gòu)中使用乓序,即當(dāng)滿足某條件時(shí)才觸發(fā)
return;
}
System.out.println(int1);
}
// 因?yàn)橐陨涎h(huán)中唯一結(jié)束的方式只有return寺酪,
// 所以以下代碼是不可能被執(zhí)行的,不能通過編譯
// System.out.println("5了~~~");
}
}