社交媒体

流程控制:if-else 与 switch

流程控制:if-else 与 switch

钩子

先看一个任务:给成绩定等级,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 链自带的逻辑。新手常在这里写冗余条件,代码能跑但显得外行。

09-if-else分支执行图.png

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 结束。

09-case穿透执行图.png

不是 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 更清爽。


橙码酱,分享更有用的技术知识,助你成为更优秀的开发者。