Java中的switch-case語句的語法、特征詳解
switch-case是Java中一種重要的多分支選擇結(jié)構(gòu),它提供了一種更清晰、更高效的方式來處理多個(gè)條件分支。本文將全面介紹Java中switch-case語句的語法、特性以及在不同Java版本中的演進(jìn)。
1. 基礎(chǔ)語法結(jié)構(gòu)
Java中switch-case的基本語法如下:
switch (expression) {
case value1:
// 代碼塊1
break;
case value2:
// 代碼塊2
break;
// 可以有任意數(shù)量的case語句
default:
// 默認(rèn)代碼塊
}1.1 關(guān)鍵組成部分

- ?switch表達(dá)式?:可以是以下類型:
- 整型(byte, short, int)
- 字符型(char)
- 枚舉類型(enum)
- 字符串(String,Java 7+)
- 包裝類(Integer, Character等,Java 5+)
- ?case標(biāo)簽?:必須是常量表達(dá)式,且類型與switch表達(dá)式兼容
- ?break語句?:用于退出switch塊(可選但通常需要)
- ?default分支?:當(dāng)沒有匹配的case時(shí)執(zhí)行(可選)
2. 傳統(tǒng)switch-case(Java 7及之前)



2.1 基本示例
int day = 3;
String dayName;
switch (day) {
case 1:
dayName = "星期一";
break;
case 2:
dayName = "星期二";
break;
case 3:
dayName = "星期三";
break;
case 4:
dayName = "星期四";
break;
case 5:
dayName = "星期五";
break;
default:
dayName = "周末";
}
System.out.println(dayName); // 輸出:星期三2.2 注意事項(xiàng)
- ?case穿透(Fall-through)??:如果省略break,會(huì)繼續(xù)執(zhí)行下一個(gè)case的代碼
int num = 2;
switch (num) {
case 1:
System.out.println("一");
case 2:
System.out.println("二"); // 會(huì)執(zhí)行
case 3:
System.out.println("三"); // 也會(huì)執(zhí)行
default:
System.out.println("其他"); // 也會(huì)執(zhí)行
}
// 輸出:
// 二
// 三
// 其他- ?default位置?:可以放在任意位置,但通常放在最后
- ?case值必須唯一?:不能有重復(fù)的case值
3. Java 7增強(qiáng):支持字符串
從Java 7開始,switch支持String類型:
String fruit = "apple";
switch (fruit) {
case "banana":
System.out.println("香蕉");
break;
case "apple":
System.out.println("蘋果");
break;
case "orange":
System.out.println("橙子");
break;
default:
System.out.println("未知水果");
}
// 輸出:蘋果?注意?:字符串比較是區(qū)分大小寫的,且不能為null
4. Java 12+新特性:switch表達(dá)式
Java 12引入了更簡(jiǎn)潔的switch表達(dá)式(正式成為標(biāo)準(zhǔn)特性是在Java 14):
4.1 箭頭語法(->)
int day = 3;
String dayName = switch (day) {
case 1 -> "星期一";
case 2 -> "星期二";
case 3 -> "星期三";
case 4 -> "星期四";
case 5 -> "星期五";
default -> "周末";
};
System.out.println(dayName); // 輸出:星期三4.2 yield返回值(Java 13+)
對(duì)于多行代碼塊,可以使用yield返回值:
String fruit = "apple";
String description = switch (fruit) {
case "banana" -> "黃色的彎曲水果";
case "apple" -> {
String color = "紅色";
yield color + "的圓形水果";
}
case "orange" -> "橙色的柑橘類水果";
default -> "未知水果";
};
System.out.println(description); // 輸出:紅色的圓形水果4.3 多case組合
int month = 2;
int days = switch (month) {
case 1, 3, 5, 7, 8, 10, 12 -> 31;
case 4, 6, 9, 11 -> 30;
case 2 -> {
// 這里可以添加更復(fù)雜的邏輯
yield 28; // 簡(jiǎn)化的閏年判斷
}
default -> throw new IllegalArgumentException("無效月份: " + month);
};
System.out.println(days); // 輸出:285. 現(xiàn)代switch 表達(dá)式語法結(jié)構(gòu) (Java 14+)
result = switch (expression) {
case value1 -> expression1;
case value2 -> {
// 代碼塊
yield result;
}
case value3, value4 -> expression3; // 多case
default -> defaultExpression;
};
6. 完整 switch-case 語法元素圖
7. 執(zhí)行流程圖

8. 歷史演進(jìn)

9. 與傳統(tǒng)if-else的比較
9.1 選擇依據(jù)
情況 | 推薦使用 |
|---|---|
?固定值比較? | switch-case |
?范圍比較? | if-else |
?少量條件? | if-else |
?多條件(>3)?? | switch-case |
?需要類型檢查? | if-else |
?枚舉/字符串匹配? | switch-case |
9.2 性能考慮
- ?字節(jié)碼層面?:switch通常編譯為tableswitch或lookupswitch指令,比if-else的多個(gè)條件跳轉(zhuǎn)更高效
- ?可讀性?:多條件時(shí)switch通常更清晰
- ?維護(hù)性?:新增條件時(shí)switch更容易擴(kuò)展
10. 最佳實(shí)踐
- ?總是包含default?:即使你認(rèn)為已經(jīng)覆蓋所有情況
- ?處理null?:switch表達(dá)式不能為null,需要提前檢查
String input = null;
if (input == null) {
System.out.println("輸入不能為null");
return;
}
// 后續(xù)switch處理- ?使用枚舉?:使代碼更安全
enum Color { RED, GREEN, BLUE }
Color color = Color.RED;
switch (color) {
case RED -> System.out.println("紅色");
case GREEN -> System.out.println("綠色");
case BLUE -> System.out.println("藍(lán)色");
}- ?避免case穿透?:除非有意為之(如多個(gè)case共享代碼)
- ?新版Java優(yōu)先使用switch表達(dá)式?:更簡(jiǎn)潔安全
11. 常見錯(cuò)誤與陷阱
- ?忘記break?:導(dǎo)致意外的case穿透
- ?重復(fù)的case值?:編譯錯(cuò)誤
- ?類型不匹配?:case值必須與switch表達(dá)式類型兼容
- ?使用浮點(diǎn)數(shù)?:switch不支持float/double
// 錯(cuò)誤示例
double value = 1.0;
switch (value) { // 編譯錯(cuò)誤
// ...
}- ?復(fù)雜條件?:switch不適合處理復(fù)雜邏輯條件
12. 實(shí)際應(yīng)用示例
12.1 狀態(tài)機(jī)實(shí)現(xiàn)
enum State { START, PROCESSING, FINISHED }
State current = State.START;
switch (current) {
case START -> {
System.out.println("開始處理");
current = State.PROCESSING;
}
case PROCESSING -> {
System.out.println("處理中...");
current = State.FINISHED;
}
case FINISHED -> System.out.println("已完成");
}12.2 命令行工具
String command = "help";
switch (command.toLowerCase()) {
case "start" -> startService();
case "stop" -> stopService();
case "restart" -> restartService();
case "help", "?" -> showHelp();
default -> System.out.println("未知命令: " + command);
}12.3 游戲開發(fā)
char input = 'w';
switch (input) {
case 'w', 'W' -> movePlayer(0, 1); // 上
case 'a', 'A' -> movePlayer(-1, 0); // 左
case 's', 'S' -> movePlayer(0, -1); // 下
case 'd', 'D' -> movePlayer(1, 0); // 右
default -> System.out.println("無效輸入");
}總結(jié)
Java的switch-case語句從最初的基本形式發(fā)展到現(xiàn)在的switch表達(dá)式,提供了更強(qiáng)大、更靈活的多分支選擇能力。關(guān)鍵要點(diǎn):
- ?傳統(tǒng)switch?:適用于簡(jiǎn)單、離散值的多分支選擇
- ?switch表達(dá)式?(Java 12+):更簡(jiǎn)潔,可以直接返回值
- ?類型支持?:支持整數(shù)、枚舉、字符串等多種類型
- ?最佳實(shí)踐?:總是包含default,處理null,優(yōu)先使用新版語法
隨著Java語言的演進(jìn),switch-case仍然是處理多分支邏輯的高效工具,特別是在代碼可讀性和維護(hù)性方面具有明顯優(yōu)勢(shì)。
到此這篇關(guān)于Java中的switch-case語句的語法、特征詳解的文章就介紹到這了,更多相關(guān)java switch-case語句內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springboot實(shí)現(xiàn)動(dòng)態(tài)定時(shí)任務(wù)流程詳解
通過重寫SchedulingConfigurer方法實(shí)現(xiàn)對(duì)定時(shí)任務(wù)的操作,單次執(zhí)行、停止、啟動(dòng)三個(gè)主要的基本功能,動(dòng)態(tài)的從數(shù)據(jù)庫中獲取配置的定時(shí)任務(wù)cron信息,通過反射的方式靈活定位到具體的類與方法中2022-09-09
Java 中的vector和list的區(qū)別和使用實(shí)例詳解
在大家還沒有了解vector,list,deque的知識(shí)之前,我先給大家介紹下stl,本文重點(diǎn)給大家介紹vector和list的區(qū)別及使用,感興趣的的朋友一起看看吧2017-09-09
將Java項(xiàng)目提交到云服務(wù)器的流程步驟
所謂將項(xiàng)目提交到云服務(wù)器即將你的項(xiàng)目打成一個(gè) jar 包然后提交到云服務(wù)器即可,因此我們需要準(zhǔn)備服務(wù)器環(huán)境為:Linux + JDK + MariDB(MySQL)+ Git + Maven,文中通過圖文講解的非常詳細(xì),需要的朋友可以參考下2025-04-04
Java實(shí)現(xiàn)第三方 HTTP 接口重試實(shí)現(xiàn)方式
本文主要介紹了Java實(shí)現(xiàn)第三方 HTTP 接口重試實(shí)現(xiàn)方式,包括手寫循環(huán)重試、使用SpringRetry、Feign+Resilience4j、GuavaRetryer和MQ延遲重試,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2026-02-02
SpringBoot+Email發(fā)送郵件的實(shí)現(xiàn)示例
Spring?Boot提供了簡(jiǎn)單而強(qiáng)大的郵件發(fā)送功能,本文主要介紹了SpringBoot+Email發(fā)送郵件的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03
詳解SpringBoot配置文件啟動(dòng)時(shí)動(dòng)態(tài)配置參數(shù)方法
這篇文章主要介紹了詳解SpringBoot配置文件啟動(dòng)時(shí)動(dòng)態(tài)配置參數(shù)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11

