Java中规则switch与普通switch的区别是什么?
普通switch与箭头式switch的区别解析
一、性能差异
二者在性能上没有本质区别。Java编译器会将箭头式switch(也叫增强switch/switch表达式)编译为与普通switch几乎一致的字节码,底层执行逻辑完全相同,不存在快慢之分。
二、核心区别
1. 贯穿(Fall-through)行为
- 普通switch默认会发生贯穿,必须手动添加
break才能跳出当前case,否则会继续执行后续case的代码:switch(var){ case 1: System.out.println("匹配1"); break; // 不加break会继续执行case2的逻辑 case 2: System.out.println("匹配2"); } - 箭头式switch默认禁止贯穿,箭头
->相当于自带break,执行完当前case逻辑后直接跳出switch结构:switch(var){ case 1 -> System.out.println("匹配1"); // 执行后直接结束,不会到case2 case 2 -> System.out.println("匹配2"); }
2. 表达式/语句特性
- 箭头式switch可作为表达式使用,直接返回值赋值给变量,这是普通switch不具备的能力:
// 箭头式switch作为表达式直接赋值 String result = switch(var){ case 1 -> "one"; case 2 -> "two"; default -> "other"; }; - 普通switch只能作为语句执行,若要获取返回值,必须在内部通过变量接收:
String result; switch(var){ case 1: result = "one"; break; case 2: result = "two"; break; default: result = "other"; }
3. 多case合并写法
箭头式switch支持更简洁的多case合并语法:
// 箭头式合并多个case switch(var){ case 1, 2, 3 -> System.out.println("匹配1-3"); case 4 -> System.out.println("匹配4"); }
普通switch合并多case需要逐个列出case,依赖贯穿特性实现(还需注意break的位置):
switch(var){ case 1: case 2: case 3: System.out.println("匹配1-3"); break; case 4: System.out.println("匹配4"); break; }
4. 多行代码块的处理
箭头式switch的case逻辑若需多行代码,可用{}包裹;如果作为表达式返回值,必须用yield关键字指定返回值:
String result = switch(var){ case 1 -> { System.out.println("处理case1的逻辑"); yield "one"; // 表达式模式下必须用yield返回值 } default -> "other"; };
普通switch的多行代码块无需额外关键字,直接执行语句即可。
5. 默认分支的强制要求
当箭头式switch作为表达式使用时,必须覆盖所有可能的输入情况,或显式添加default分支,否则编译报错;而普通switch作为语句时,即使没有default分支也能正常编译(无匹配case时不会执行任何逻辑)。
内容的提问来源于stack exchange,提问作者The Dog on the Log
相关产品推荐
相关产品推荐

