入门篇-其之九-流程控制之条件判断
本文中使用到的工具是Intellij IDEA和JDK 8,需要安裝兩款工具的請查看這兩篇教程:點(diǎn)我查看安裝JDK8/11/17教程、點(diǎn)我查看安裝Intellij IDEA教程。
前面我們寫過的代碼,都是在main方法中自上到下按順序執(zhí)行的,舉一個代碼栗子:
/**
* 計算西瓜的價格
*
* @author iCode504
* @date 2023-10-31
*/
public class MyWatermelonDemo1 {
public static void main(String[] args) {
int price = 2; // 西瓜的單價
int weight = 10; // 西瓜的重量(公斤)
int totalPrice = price * weight; // 購買價格
System.out.println("西瓜的價格是: " + totalPrice + "元");
}
}
這段代碼就是先定義西瓜的單價、再定義西瓜的重量,然后計算西瓜的價格,最后對價格進(jìn)行輸出。像這樣代碼從上到下執(zhí)行的結(jié)構(gòu)就是順序結(jié)構(gòu)。
程序一共有三種控制結(jié)構(gòu):順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。其中選擇結(jié)構(gòu)是根據(jù)條件判定的結(jié)果,選擇執(zhí)行不同的代碼,例如:紅燈停,綠燈行。判斷條件就是交通信號燈的狀態(tài)。
Java也有選擇結(jié)構(gòu),并且有多種類型的條件判斷語句:單分支的if語句、雙分支的if-else語句、多分支的if-else if-else語句、if嵌套語句和switch語句。
一、單分支if語句
單分支if語句的語法如下:
if (條件表達(dá)式) {
執(zhí)行代碼...
}
其中條件表達(dá)式的計算結(jié)果必須是boolean類型。如果條件表達(dá)式的計算結(jié)果是true,那么就會執(zhí)行if內(nèi)部的代碼;如果表達(dá)式為false,此時就會跳過if代碼塊(也就是if內(nèi)部代碼不執(zhí)行),概念圖如下:
我們可以在if代碼塊中可以編寫多個執(zhí)行語句。
以下是if的使用案例:
案例:之前長春下了大暴雪,氣溫驟降,我想在某寶上買幾雙棉襪子,假設(shè)每雙襪子4元,請確保輸入的數(shù)字大于0再計算購買價格。
分析:解題的關(guān)鍵在于要保證輸入的數(shù)字要大于0,因此要判斷輸入的數(shù)字是否大于0,示例代碼如下:
import java.util.Scanner;
/**
* if條件判斷
*
* @author iCode504
* @date 2023-11-07
*/
public class IfDemo1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入襪子的數(shù)量");
int count = scanner.nextInt();
double totalPrice = 0.0; // 默認(rèn)總價格初始值為0.0
double price = 4; // 襪子的價格4元
// 條件判斷: 輸入的數(shù)量是否大于0
if (count > 0) {
totalPrice = count * price;
System.out.println("購買了" + count + "雙襪子, 價格是" + totalPrice + "元");
}
}
}
運(yùn)行結(jié)果:
案例:輸入一個數(shù)字,如果能被10整除,則輸出內(nèi)容為:xx能被10整除。如果能被15整除,則輸出內(nèi)容為:xx能被15整除。
解決本題的關(guān)鍵點(diǎn)在于被10整除和被15整除的條件怎么計算。其實(shí)前面我們學(xué)過取余運(yùn)算符,如果數(shù)值number能被10整除,那么可以寫成number % 10 == 0;如果數(shù)值number能被15整除,那么可以寫成number % 15 == 0。這兩個布爾表達(dá)式可以寫入到兩個if語句中:
import java.util.Scanner;
/**
* 使用if語句判斷數(shù)字能否被10和15整除
*
* @author iCode504
* @date 2023-11-07
*/
public class IfDemo2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入數(shù)字: ");
int number = scanner.nextInt();
// 整除10的條件:數(shù)字對10取余等于0
if (number % 10 == 0) {
System.out.println(number + "能被10整除");
}
// 整除15的條件:數(shù)字對15取余等于0
if (number % 15 == 0) {
System.out.println(number + "能被15整除");
}
}
}
輸入不同的數(shù)字以后,會得到如下的運(yùn)行結(jié)果:
案例:輸入兩個整數(shù),如果輸入的第一個數(shù)字比第二個數(shù)字大,那么執(zhí)行兩數(shù)交換,并將交換結(jié)果輸出。否則不交換,正常輸出兩個數(shù)
本題的條件表達(dá)式是輸入的兩個數(shù)字的比較,無論數(shù)字大小比較結(jié)果如何,都需要將結(jié)果進(jìn)行輸出,我們可以將輸出語句放到if語句后面執(zhí)行。
兩數(shù)交換有多種方式,較為穩(wěn)妥的方式是再定義一個臨時變量,用這個臨時變量來接收第一個變量值,然后第二個變量值賦值給第一個變量,最后將臨時變量的值賦值給第二個變量。
以下是示例代碼:
import java.util.Scanner;
/**
* 單分支if語句實(shí)現(xiàn)兩數(shù)交換
*
* @author iCode504
* @date 2023-11-11
*/
public class IfDemo3 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入兩個整數(shù)");
int number1 = scanner.nextInt();
int number2 = scanner.nextInt();
int temp = 0; // 定義臨時變量
if (number1 > number2) { // 實(shí)現(xiàn)兩數(shù)交換功能
temp = number1;
number1 = number2;
number2 = temp;
}
System.out.println("第一個數(shù)是: " + number1 + ", 第二個數(shù)是: " + number2);
}
}
運(yùn)行結(jié)果:
當(dāng)然,除了上述方式能實(shí)現(xiàn)兩數(shù)交換,還有其他的方式。
方式一:使用加減法進(jìn)行交換(推薦使用整數(shù),浮點(diǎn)數(shù)不推薦,因?yàn)楦↑c(diǎn)數(shù)計算時會出現(xiàn)誤差)
int number1 = 3;
int number2 = 2;
number1 = number1 + number2; // number1 = 3 + 2 = 5
number2 = number1 - number2; // number2 = 5 - 2 = 3
number1 = number1 - number2; // number1 = 5 - 3 = 2
方式二:使用位運(yùn)算符進(jìn)行交換(推薦使用整數(shù),此處涉及到二進(jìn)制異或運(yùn)算,異或運(yùn)算可以查看這篇文章:入門篇-其之六-Java運(yùn)算符(中)第四部分-位運(yùn)算符)
int number1 = 3;
int number2 = 2;
number1 = number1 ^ number2; // 3 ^ 2 = 1
number2 = number1 ^ number2; // 3 ^ 1 = 2
number1 = number1 ^ number2; // 1 ^ 2 = 3
當(dāng)然,上述三種方式我個人最推薦的還是第一種定義臨時變量的方式,這種方式對處理浮點(diǎn)類型的數(shù)進(jìn)行交換很友好,如果使用了下面兩種方式的話,可能會在計算過程中出現(xiàn)精度損失的問題。后兩種方式的好處是不需要定義第三個變量,只需要進(jìn)行一系列運(yùn)算即可完成整數(shù)值的交換。
二、if-else雙分支語句
前面講過的單分支if語句只有在布爾表達(dá)式為true的時候執(zhí)行其內(nèi)部的內(nèi)容,但是如果在布爾表達(dá)式為false的時候不會做任何事情。為了解決上述問題,Java為我們提供了if-else雙分支語句。以下是雙分支if-else語句代碼結(jié)構(gòu):
if (條件表達(dá)式) {
執(zhí)行代碼1...
} else {
執(zhí)行代碼2...
}
如果條件表達(dá)式的值是true,那么就執(zhí)行if內(nèi)部的語句,如果條件表達(dá)式為false,此時就進(jìn)入else代碼塊。執(zhí)行流程圖如下:
案例:我們還是以上述買襪子為例,最近雙十一打折,如果買了10雙及以上襪子,此時每雙襪子打八折優(yōu)惠,否則打九折優(yōu)惠(襪子的價格假設(shè)是4元/雙)。
題目中的條件表達(dá)式在于要買的襪子數(shù)量是否大于等于10,如果是,價格打8折,否則打9折,使用剛剛講到的if-else語句即可搞定。
當(dāng)然,這道題中還有一個隱藏的細(xì)節(jié)需要我們處理:輸入襪子的數(shù)量需要大于0,否則判定為無效,這個可以使用單分支if語句就可以搞定。
以下是示例代碼:
import java.util.Scanner;
/**
* if-else雙分支語句
*
* @author iCode504
* @date 2023-11-11
*/
public class IfDemo4 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入要購買的襪子數(shù)量");
int count = scanner.nextInt();
double price = 4; // 每雙襪子的價格
double totalPrice = 0.0; // 默認(rèn)總價格為0.0
// 需要保證輸入的襪子數(shù)量要大于0
if (count > 0) {
// 如果襪子的數(shù)量大于10,此時每雙襪子的價格為8折,即每雙襪子的價格乘以0.8,九折的計算方式和上述內(nèi)容同理
if (count >= 10) {
totalPrice = price * 0.8 * count;
} else {
totalPrice = price * 0.9 * count;
}
}
System.out.println("購買" + count + "雙襪子,雙十一期間購買價格是" + totalPrice + "元");
}
}
運(yùn)行結(jié)果(可能會出現(xiàn)浮點(diǎn)數(shù)計算不準(zhǔn)確的情況,屬于正常現(xiàn)象):
三、if-else if-else多分支語句
雙分支的if-else語句對于條件表達(dá)式為true和false的時候比較適用,但是如果對于一個問題而言,此時經(jīng)過分析可能存在多個條件表達(dá)式時,if-else語句并不能很好地完成任務(wù),此時Java為我們提供了另一種分支語句:if-else if-else語句,其語法格式如下:
if (條件表達(dá)式1) {
執(zhí)行代碼1...
} else if (條件表達(dá)式2) {
執(zhí)行代碼2...
} else if (條件表達(dá)式3) {
執(zhí)行代碼3...
} ...
else if (條件表達(dá)式n) {
執(zhí)行代碼n...
} else {
不符合上述所有條件表達(dá)式時執(zhí)行else代碼...
}
以上述語法格式為例,其執(zhí)行順序?yàn)椋?/p>
- 如果條件表達(dá)式1的結(jié)果為
true,那么執(zhí)行代碼1,如果結(jié)果是false,此時就會跳轉(zhuǎn)到第一個else if。 - 如果條件表達(dá)式2的結(jié)果是
true,那么執(zhí)行代碼2,如果結(jié)果是false,那么就會跳轉(zhuǎn)到第二個else if。 - 如果條件表達(dá)式3的結(jié)果是
true,那么執(zhí)行代碼3,如果結(jié)果是false,那么就會跳轉(zhuǎn)到下一個else if,依次類推。 - 當(dāng)上述所有的條件表達(dá)式都不滿足(即結(jié)果全部是
false)時,就會執(zhí)行else中的語句。
多分支的if-else if-else語句中,你可以寫任意個else if,每個else if需要寫上條件表達(dá)式。
當(dāng)然,最后的else也是可選的,if和else-if搭配使用也是可以的。以下是執(zhí)行流程圖:
案例:已知長春的地鐵/輕軌票價標(biāo)準(zhǔn)如下
- 0-7公里(含7公里),票價2元;
- 7-13公里(含13公里),票價3元;
- 13-19公里(含19公里),票價4元;
- 19-27公里(含27公里),票價5元;
- 27-35公里(含35公里),票價6元;
- 35公里以上每增加10公里,增加1元
假設(shè)從1號線紅嘴子地鐵站到8號線廣通路輕軌站的距離是31.4公里,從2號線汽車公園地鐵站到2號線東方廣場地鐵站的距離是20.5公里,從4號線長春站北輕軌站到4號線天工路輕軌站的距離是16.3公里。
輸入上述里程,利用程序計算出乘坐軌道交通所需要的票價。
上述題目中出現(xiàn)了多個條件判斷,每個條件判斷執(zhí)行內(nèi)容都不相同,使用多分支語句if-else if-else語句比較合適。題目中有一個隱藏條件,輸入里程數(shù)不能為負(fù)數(shù),當(dāng)然這個條件也直接寫入條件判斷即可。
如果乘坐軌道交通的里程超過35公里以后,每增加10公里,增加1元。例如:乘坐45公里就要在35公里對應(yīng)的票價6元的基礎(chǔ)上再增加1元,當(dāng)然,55公里、65公里依次類推。假設(shè)稱作里程為44.9公里,此時收費(fèi)標(biāo)準(zhǔn)仍為35公里的票價。
針對上述問題,我們可以在代碼中進(jìn)一步呈現(xiàn):
import java.util.Scanner;
/**
* if-else if-else多分支語句的使用
*
* @author iCode504
* @date 2023-11-14
*/
public class ElseIfDemo1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("請輸入里程數(shù): ");
// 里程數(shù)使用double類型比較合適,因?yàn)轭}目中涉及到距離的使用到了小數(shù)
double distance = scanner.nextDouble();
int price = 0;
if (distance <= 0) {
System.out.println("無效里程");
} else if (distance > 0 && distance <= 7) {
price = 2;
} else if (distance > 7 && distance <= 13) {
price = 3;
} else if (distance > 13 && distance <= 19) {
price = 4;
} else if (distance > 19 && distance <= 27) {
price = 5;
} else if (distance > 27 && distance <= 35) {
price = 6;
} else {
// 超過35公里的需要額外進(jìn)行處理
price = 6; // 35公里對應(yīng)的票價
// 計算多余的里程
// 這里需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換的目的有兩個:
// 1. 最后計算票價的price是int類型
// 2. 針對類似在35~45公里之間的里程后續(xù)的票價計算處理
int additionalDistance = (int) (distance - 35);
// 計算票價
price = price + additionalDistance / 10;
}
System.out.println("乘坐長春軌道交通里程" + distance + "公里,票價" + price + "元");
}
}
運(yùn)行結(jié)果如下:
四、if的嵌套使用
正如標(biāo)題所講,if語句可以嵌套使用。舉個栗子:在main方法中,假設(shè)已經(jīng)存在了一個if-else語句,那么在這個if代碼塊或者else代碼塊還可以存在條件判斷語句,下面就是其中一種if的嵌套使用方式(事實(shí)上它可以if代碼塊可以進(jìn)行多種組合嵌套使用):
if (條件表達(dá)式1) {
if (條件表達(dá)式2) {
執(zhí)行代碼1...
} else {
執(zhí)行代碼2...
}
} else {
if (條件表達(dá)式3) {
執(zhí)行代碼3...
} else {
執(zhí)行代碼4...
}
}
它的執(zhí)行流程如下:
- 如果條件表達(dá)式1的執(zhí)行結(jié)果是
true,進(jìn)入條件表達(dá)式2,如果條件表達(dá)式2執(zhí)行結(jié)果是true,此時執(zhí)行代碼1。 - 如果條件表達(dá)式1的執(zhí)行結(jié)果是
true,進(jìn)入條件表達(dá)式2,如果條件表達(dá)式2執(zhí)行結(jié)果是false,此時執(zhí)行代碼2。 - 如果條件表達(dá)式1的執(zhí)行結(jié)果是
false,進(jìn)入條件表達(dá)式3,如果條件表達(dá)式3執(zhí)行結(jié)果是true,此時執(zhí)行代碼3。 - 如果條件表達(dá)式1的執(zhí)行結(jié)果是
false,進(jìn)入條件表達(dá)式3,如果條件表達(dá)式3執(zhí)行結(jié)果是false,此時執(zhí)行代碼4。
執(zhí)行流程圖如下所示:
日常寫代碼的過程中,盡量保證代碼嵌套的層數(shù)不超過兩層。
案例:輸入三個數(shù),要求輸出是按照從大到小進(jìn)行排列。例如,輸入三個數(shù)為20、30、10,輸出結(jié)果為30、20、10
- 第一層條件:比較第一個數(shù)和第二個數(shù)。
- 第二層條件:比較第二個數(shù)和第三個數(shù)。
- 第三層條件:比較第一個數(shù)和第三個數(shù)。
import java.util.Scanner;
/**
* if的嵌套--三個數(shù)字排列
*
* @author iCode504
* @date 2023-11-23
*/
public class IfDemo5 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("請輸入三個整數(shù): ");
int number1 = scanner.nextInt();
int number2 = scanner.nextInt();
int number3 = scanner.nextInt();
if (number1 > number2) {
if (number2 > number3) {
System.out.println("三個數(shù)從大到小的排序是: " + number1 + " " + number2 + " " + number3);
} else {
if (number1 > number3) {
System.out.println("三個數(shù)從大到小的排序是: " + number1 + " " + number3 + " " + number2);
} else {
System.out.println("三個數(shù)從大到小的排序是: " + number3 + " " + number1 + " " + number2);
}
}
} else {
if (number2 < number3) {
System.out.println("三個數(shù)從大到小的排序是: " + number3 + " " + number2 + " " + number1);
} else {
if (number1 > number3) {
System.out.println("三個數(shù)從大到小的排序是: " + number2 + " " + number3 + " " + number1);
} else {
System.out.println("三個數(shù)從大到小的排序是: " + number2 + " " + number1 + " " + number3);
}
}
}
}
}
運(yùn)行結(jié)果:
雖然運(yùn)行結(jié)果符合我們的預(yù)期,但是我只能說:這樣的代碼寫的非常糟糕!!!這段代碼中if的嵌套層數(shù)達(dá)到了三層,事實(shí)上if嵌套兩層以上可讀性就大打折扣了。
我們可以使用Java數(shù)組、循環(huán)和數(shù)組方法對此問題做進(jìn)一步處理(小白可以跳過這一部分)。
import java.util.Arrays;
import java.util.Scanner;
/**
* 三數(shù)比較--按照從大到小的順序排列
*
* @author iCode504
* @date 2023-11-23
*/
public class IfDemo6 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("請輸入三個數(shù)字: ");
Integer[] array = new Integer[3];
for (int i = 0; i < array.length; i++) {
array[i] = scanner.nextInt();
}
// 調(diào)用Arrays.sort方法對數(shù)組排序,排序規(guī)則從大到小(lambda表達(dá)式)
Arrays.sort(array, (o1, o2) -> o2 - o1);
System.out.println("三個數(shù)從大到小的排序是: " + array[0] + " " + array[1] + " " + array[2]);
}
}
運(yùn)行結(jié)果:
五、switch語句
if-else if-else多分支語句可以用于多個條件表達(dá)式的判斷,我們可以寫非常多的else if,然而過多的else if可能會導(dǎo)致代碼的可讀性變差。
Java為我們提供了swtich語句在一定程度上可以簡化多條件分支。以下是switch的語法結(jié)構(gòu):
switch (表達(dá)式) {
case 值1:
執(zhí)行代碼1...
break;
case 值2:
執(zhí)行代碼2...
// break
case 值3:
執(zhí)行代碼3...
break;
...
case 值n:
執(zhí)行代碼n...
break;
default:
上述條件都不適用執(zhí)行代碼...
}
1. switch語句中表達(dá)式的計算結(jié)果、值1、值2、...、值n的數(shù)據(jù)類型必須要保持一致。支持的數(shù)據(jù)類型包括:byte、short、int、char、字符串類型String(JDK 7新特性)、枚舉類型(后續(xù)會講到,JDK 7新特性)。
2. 如果表達(dá)式的計算結(jié)果和case中某個值相等時,就會執(zhí)行這個case內(nèi)的代碼。
3. switch語句中的default是可選的,它的作用是當(dāng)表達(dá)式的計算結(jié)果和所有case的值都不相等時才會執(zhí)行default語句,如果default語句不存在時,所有的case對應(yīng)的值和判定值都不相等時,跳出switch語句。
4. break的作用是跳出switch語句(break關(guān)鍵字還會在循環(huán)中遇到),在每一個case對應(yīng)的代碼塊后面寫上break是個好習(xí)慣。
如果case中不加break,此時switch語句會出現(xiàn)穿透性,即當(dāng)某一個case執(zhí)行完成后,它會繼續(xù)執(zhí)行下面其他的case。以下是一個是否使用break的案例:
案例:輸入數(shù)字1~7,使用
switch語句輸出當(dāng)前日期(假設(shè)7代表星期日)
import java.util.Scanner;
/**
* switch語句--不加break--穿透性
*
* @author iCode504
* @date 2023-11-15
*/
public class SwitchDemo1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入星期數(shù)(1~7), 7表示星期日");
int number = scanner.nextInt();
switch (number) {
case 1:
String monday = "星期一";
System.out.println("今天是" + monday);
case 2:
String tuesday = "星期二";
System.out.println("今天是" + tuesday);
case 3:
String wednesday = "星期三";
System.out.println("今天是" + wednesday);
case 4:
String thursday = "星期四";
System.out.println("今天是" + thursday);
case 5:
String friday = "星期五";
System.out.println("今天是" + friday);
case 6:
String saturday = "星期六";
System.out.println("今天是" + saturday);
case 7:
String sunday = "星期日";
System.out.println("今天是" + sunday);
default:
System.out.println("無效日期");
}
}
}
運(yùn)行結(jié)果:
很明顯,輸入數(shù)字3的時候,由于沒有break,當(dāng)執(zhí)行case 3內(nèi)部代碼以后,它會向下執(zhí)行其他case中的代碼,直至default內(nèi)的代碼執(zhí)行完畢為止。并且這段代碼還有可以進(jìn)一步修改的空間,以下是加入break并進(jìn)行簡化的代碼:
import java.util.Scanner;
/**
* switch語句--添加break--穿透性
*
* @author iCode504
* @date 2023-11-15
*/
public class SwitchDemo2 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入星期數(shù)(1~7), 7表示星期日");
int number = scanner.nextInt();
String weekday;
switch (number) {
case 1:
weekday = "星期一";
break;
case 2:
weekday = "星期二";
break;
case 3:
weekday = "星期三";
break;
case 4:
weekday = "星期四";
break;
case 5:
weekday = "星期五";
break;
case 6:
weekday = "星期六";
break;
case 7:
weekday = "星期日";
break;
default:
weekday = "無效星期";
}
System.out.println("今天是" + weekday);
}
}
運(yùn)行結(jié)果:
從上述結(jié)果可以看出,使用break以后,就可以阻斷switch穿透性。
switch語句執(zhí)行流程如下圖所示(每個case都帶上break語句):
在了解了switch語句的基礎(chǔ)上,我們再來講解一個switch語句和if-else語句結(jié)合使用的案例:
案例:輸入年份和月份,輸出格式如下:xxxx年xx月有xx天。
常識:1、3、5、7、8、10、12恒定是31天;4、6、9、11恒定為30天。這幾個月份我們可以利用switch的穿透性替換掉多條件的else if判斷。
需要額外考慮的是:2月份的天數(shù)需要考慮年份是閏年還是平年,閏年能被400整除,例如:2000年,1600年是閏年,1900年就不是閏年。此外,如果不能被100整除,而能被4整除的也是閏年,例如:2020,2016,2004,2008年都是閏年。
結(jié)合上述分析,我們可以使用代碼進(jìn)一步復(fù)現(xiàn):
import java.util.Scanner;
/**
* switch和if結(jié)合使用
*
* @author iCode504
* @date 2023-11-15
*/
public class SwitchDemo3 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("請輸入年份: ");
int year = scanner.nextInt();
System.out.print("請輸入月份: ");
int month = scanner.nextInt();
int day = 0;
switch (month) {
// 利用switch的穿透性
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
day = 31;
break;
case 4:
case 6:
case 9:
case 11:
day = 30;
break;
case 2:
// 2月份需要額外針對年份進(jìn)行判斷
if (year % 400 == 0) {
day = 29;
} else if (year % 4 == 0 && year % 100 != 0) {
day = 28;
}
break;
default:
// 不在1-12月份內(nèi)做出說明
System.out.println("無效的月份");
}
System.out.println(year + "年" + month + "月有" + day + "天");
}
}
運(yùn)行結(jié)果:
以我個人的開發(fā)經(jīng)驗(yàn)來看,使用switch語句的頻率要比使用if語句要少很多,二者的執(zhí)行效率基本上差不太多。
if可以編寫更加靈活的條件表達(dá)式。比如:判斷某個整數(shù)在[10, 20]區(qū)間內(nèi),此時使用if條件表達(dá)式可以寫成if (number >= 10 && number <= 20),如果使用switch解決此問題會讓代碼變得更加復(fù)雜(因?yàn)槟阋獙懞芏鄠€case進(jìn)行比較)。
switch更擅長特定類型的值進(jìn)行比較。以上面根據(jù)某年某月求當(dāng)前月份由多少天為例,事實(shí)上完全使用if語句實(shí)現(xiàn),只不過我們需要寫成:
使用前面案例對應(yīng)的switch代碼,和if語句對比,個人覺得可讀性變高:
因此,使用if語句還是switch語句還是得根據(jù)具體的代碼場景而決定。
六、《阿里巴巴Java開發(fā)手冊》關(guān)于條件判斷語句的相關(guān)規(guī)范
1. 【強(qiáng)制】在一個switch塊內(nèi),每個case要么通過continue/break/return等來終止,要么注釋說明程序?qū)⒗^續(xù)執(zhí)行到哪一個case為止;在一個switch塊內(nèi),都必須包含一個default語句并且放在最后,即使它什么代碼也沒有。
說明:注意break是退出switch語句塊,而return是退出方法體。
2. 【強(qiáng)制】當(dāng)switch括號內(nèi)的變量類型為String并且此變量為外部參數(shù)時,必須先進(jìn)行null判斷。
反例:如下的代碼輸出內(nèi)容是什么?
public class SwitchString {
public static void main(String[] args) {
method(null);
}
public static void method(String param) {
switch (param) {
// 肯定不是進(jìn)入這里
case "sth":
System.out.println("it's sth");
break;
// 也不是進(jìn)入這里
case "null":
System.out.println("it's null");
break;
// 也不是進(jìn)入這里
default:
System.out.println("default");
}
}
}
3. 【強(qiáng)制】在if/else/for/while/do語句中必須使用大括號。
說明:即使只有一行代碼,禁止不采用大括號的編碼方式:if (條件表達(dá)式) statements; ,上述代碼需改成如下格式:
if (條件表達(dá)式) {
statements;
}
4. 【推薦】表達(dá)異常的分支時,少用if-else方式,這種方式可以改寫成:
if (condition) {
...
return obj;
}
// 接著寫 else 的業(yè)務(wù)邏輯代碼;
說明:如果非使用if()...else if()...else...方式表達(dá)邏輯,避免后續(xù)代碼維護(hù)困難,請勿超過 3 層。
正例:超過 3 層的if-else的邏輯判斷代碼可以使用衛(wèi)語句、策略模式、狀態(tài)模式等來實(shí)現(xiàn),其中衛(wèi)語句示例如下(不了解衛(wèi)語句是什么的小伙伴可以參考這篇文章:點(diǎn)我查看):
public void findBoyfriend (Man man){
if (man.isUgly()) {
System.out.println("本姑娘是外貌協(xié)會的資深會員");
return;
}
if (man.isPoor()) {
System.out.println("貧賤夫妻百事哀");
return;
}
if (man.isBadTemper()) {
System.out.println("銀河有多遠(yuǎn),你就給我滾多遠(yuǎn)");
return;
}
System.out.println("可以先交往一段時間看看");
}
5. 【推薦】避免采用取反邏輯運(yùn)算符。
說明:取反邏輯不利于快速理解,并且取反邏輯寫法必然存在對應(yīng)的正向邏輯寫法。
正例:使用if (x < 628)來表達(dá) x 小于 628。
反例:使用if (!(x >= 628))來表達(dá) x 小于 628。
七、知識點(diǎn)總結(jié)
流程控制之條件判斷知識點(diǎn)總結(jié)如下圖所示:
如需高清大圖,請點(diǎn)擊右側(cè)鏈接下載文件:點(diǎn)我下載
總結(jié)
以上是生活随笔為你收集整理的入门篇-其之九-流程控制之条件判断的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自然的自拍才叫美!vivo S10 Pr
- 下一篇: 先天性心脏病可以通过产前诊断检测出来吗?