钩子
先看一个任务:给成绩定等级,90 以上优秀,80-89 良好,60-79 及格,60 以下不及格。
用 if-else 写,四层判断,没毛病。但现在需求变了——再判断"是否全班前 10"、"是否单科状元",if-else 一层层套下去,三天后你自己都不想看第二眼。
这不是你写得烂,是工具选错了。判断"一个值等于几"这种事,Java 有专门的工具:switch。
01 if-else:程序的分岔路口
最基础的三种形态:
int score = 86;
if (score >= 90) {
System.out.println("优秀");
} else if (score >= 80) {
System.out.println("良好");
} else {
System.out.println("还得练");
}
注意一个细节:else if (score >= 80) 不用写 score < 90 && score >= 80——走到 else if 分支,说明前面的条件已经不成立了,这是 if-else 链自带的逻辑。新手常在这里写冗余条件,代码能跑但显得外行。

02 传统 switch:按表找茬,但要记得 break
判断"一个变量等于哪个固定值",switch 更清爽:
int day = 6;
switch (day) {
case 1:
System.out.println("周一,不想上班");
break;
case 6:
System.out.println("周六,睡到自然醒");
break;
default:
System.out.println("普通的一天");
break;
}
重点来了:break 不是可有可无的装饰。 把 case 6 的 break 删掉试试:
int day = 6;
switch (day) {
case 6:
System.out.println("周六,睡到自然醒");
// break 没写!
case 7:
System.out.println("周日,继续躺");
break;
default:
System.out.println("普通的一天");
break;
}
输出是两行:先打印"周六",接着"周日"也打印了。这就是 case 穿透——匹配到 case 6 之后,程序顺着往下把后面所有 case 的代码都执行一遍,直到撞见 break 或者 switch 结束。

不是 bug,是设计如此。甚至有正经用法——多个 case 共享一段逻辑:
case 6:
case 7:
System.out.println("周末");
break;
case 6、7 都"落"到同一段代码。但现在有更干净的写法,往下看。
03 箭头语法:Java 14 之后的 switch 长这样
如果你装的是 JDK 21(按第 2 篇装的应该就是),switch 可以写成这样:
String result = switch (day) {
case 6, 7 -> "周末";
default -> "工作日";
};
三个变化:箭头代替冒号、不用写 break、switch 直接能有返回值。多个值用逗号并列,穿透问题从语法层面消失——箭头只执行匹配到的那个分支。
传统写法还要学吗?要。网上老代码、面试题、公司祖传项目全是冒号写法,你得看得懂;自己写新代码,用箭头。
04 怎么选,一句话
判断范围(大于、小于、区间)用 if-else;匹配固定值(选项、菜单、星期几)用 switch。 成绩等级这种,两种都能写,但 90/80/60 是范围,if-else 更自然;"按命令行参数执行哪个功能"是固定值,switch 更清爽。
橙码酱,分享更有用的技术知识,助你成为更优秀的开发者。