Java switch case 语句
Javaswitch-case语句学习笔记详细版一、概述switch-case语句是一种多分支选择结构用于根据一个表达式的值从多个代码块中选择一个执行。相比于长链的if-else if-elseswitch在处理离散值如枚举、整数、字符串匹配时代码更简洁、可读性更高且在某些情况下性能更优。二、基本语法结构switch(表达式){case值1:// 当表达式 值1 时执行的代码break;case值2:// 当表达式 值2 时执行的代码break;case值3:case值4:// 当表达式 值3 或 值4 时执行的代码break;default:// 当所有 case 都不匹配时执行的代码可选break;}执行流程计算表达式计算switch括号内表达式的值。匹配 Case从上到下依次与case后的值进行比较。如果找到匹配项从该case开始执行代码。如果未找到匹配项跳转到default块如果有。执行与跳出执行匹配到的case代码块。关键点如果遇到break立即跳出switch结构。穿透Fall-through如果没有break程序会继续执行下一个case的代码直到遇到break或switch结束。Default如果所有case都不匹配执行default块如果存在。三、支持的数据类型Java 对switch表达式支持的数据类型有严格限制Java 版本支持的数据类型Java 1.0 - 6byte,short,char,int(及其包装类Byte,Short,Character,Integer)Java 7新增支持StringJava 5新增支持enum(枚举)Java 14新增支持record(记录类需配合 switch 表达式语法)注意不支持long,float,double,boolean以及自定义类。case后的值必须是编译期常量Constant Expression。四、核心特性详解1. 穿透性 (Fall-through)这是switch最容易出错的地方也是其独特功能。如果case后没有break执行流会“穿透”到下一个case。场景 A需要穿透合并多个 caseintmonth2;Stringseason;switch(month){case12:case1:case2:season冬季;// 12, 1, 2 月都是冬季break;case3:case4:case5:season春季;break;default:season未知;}场景 B意外穿透Bug 来源intday1;switch(day){case1:System.out.println(周一);// 忘记写 break!case2:System.out.println(周二);break;}// 输出// 周一// 周二 -- 意外执行了2. Default 分支default是可选的。如果所有case都不匹配且没有default则switch什么都不做。default可以放在switch的任意位置开头、中间、结尾但通常放在最后。default后通常也建议加break虽然放在最后不加也可以但为了规范建议加上。3. 表达式求值switch括号内的表达式只计算一次。case后的值必须是常量不能是变量。intx10;switch(x){case10:// ✅ 正确break;// case x: // ❌ 错误x 是变量不是常量// break;}五、Java 12/14 新特性Switch 表达式 (Switch Expressions)从 Java 12 开始Java 14 正式成为标准引入了Switch 表达式解决了传统switch语句冗长、易漏break的问题。1. 语法变化使用-代替:。使用yield返回值Java 13或者直接写表达式。自动 break使用-的 case 块执行完后自动跳出无需break。支持返回值整个switch可以作为一个表达式返回一个值。2. 代码对比传统写法 (Java 8)StringdayType;switch(day){case1:case2:case3:case4:case5:dayType工作日;break;case6:case7:dayType周末;break;default:dayType无效;break;}新写法 (Java 14)// 方式 1: 作为表达式直接赋值StringdayTypeswitch(day){case1,2,3,4,5-工作日;// 支持多个值用逗号分隔case6,7-周末;default-无效;};// 方式 2: 需要执行多行代码时使用 yieldStringresultswitch(day){case1-周一;case2-{System.out.println(今天是周二);yield周二;// 返回值}default-其他;};新特性优势代码更简洁无需break无需重复赋值。更安全不会意外穿透。支持多值case 1, 2, 3 -代替多个case。函数式风格可以作为表达式返回值。六、实战案例1. 基础案例星期转换publicclassWeekDay{publicstaticvoidmain(String[]args){intday3;StringdayName;switch(day){case1:dayNameMonday;break;case2:dayNameTuesday;break;case3:dayNameWednesday;break;case4:dayNameThursday;break;case5:dayNameFriday;break;case6:dayNameSaturday;break;case7:dayNameSunday;break;default:dayNameInvalid Day;break;}System.out.println(Day: dayName);}}2. 字符串匹配 (Java 7)publicclassStringSwitch{publicstaticvoidmain(String[]args){StringcommandSTART;switch(command){caseSTART:System.out.println(系统启动中...);break;caseSTOP:System.out.println(系统停止中...);break;caseRESTART:System.out.println(系统重启中...);break;default:System.out.println(未知命令);break;}}}3. 枚举使用enumColor{RED,GREEN,BLUE}publicclassEnumSwitch{publicstaticvoidmain(String[]args){ColorcColor.RED;switch(c){caseRED:System.out.println(红色代表停止);break;caseGREEN:System.out.println(绿色代表通行);break;caseBLUE:System.out.println(蓝色代表信息);break;}}}七、常见错误与注意事项1. 忘记break这是最常见的错误导致逻辑错误穿透。解决养成习惯每个case结尾都写break除非故意穿透。IDE 提示现代 IDEIntelliJ IDEA, Eclipse通常会警告未使用的break或潜在的穿透。2. 重复的case值switch(x){case1:break;case1:break;// ❌ 编译错误Duplicate case}3. 类型不匹配longnum10L;switch(num){// ❌ 编译错误long 不支持case10:break;}4. 浮点数比较doubled1.5;switch(d){// ❌ 编译错误float/double 不支持case1.5:break;}5. 变量作为 Case 值intx10;switch(val){casex:// ❌ 编译错误x 必须是常量break;}// 修正finalintX10;switch(val){caseX:// ✅ 正确break;}6. 空指针异常 (NPE)如果switch的表达式是null且类型是String或枚举会抛出NullPointerException。Stringstrnull;switch(str){// ❌ 运行时抛出 NullPointerExceptioncaseA:break;}解决在使用前进行null检查。八、switchvsif-else选择指南特性switchif-else适用场景单个变量与多个离散值匹配范围判断、复杂逻辑、多个变量组合数据类型有限 (int,String,enum等)任意布尔表达式性能较高编译器可能优化为跳转表较低逐个判断可读性多分支时清晰多分支时冗长范围判断不支持 (如x 10 x 20)完美支持代码量较少较多决策建议如果是判断一个变量等于多个具体值如菜单选项、状态码、枚举首选switch。如果是范围判断如成绩等级、温度区间或复杂逻辑组合使用if-else。九、总结核心机制根据表达式值匹配case执行对应代码。关键关键字case定义匹配值。break跳出循环防止穿透。default默认分支。穿透性无break会执行下一个case可用于合并逻辑但需小心。数据类型支持int,char,short,byte,String,enum。新特性Java 14 的switch表达式 (-,yield) 更简洁、安全。最佳实践始终处理default情况或至少意识到它。避免漏写break。检查null值针对 String/enum。优先使用switch处理离散值if-else处理范围/复杂逻辑。掌握switch-case能让你的代码在处理多分支逻辑时更加优雅和高效