Java switch 与 if-else 核心区别

一、判断条件限制不同

  1. if-else
    支持任意布尔表达式:等值、区间、多条件逻辑组合(> < >= <= && || !=),几乎所有判断场景都能用。
    示例:
if(score >= 60 && score < 90){}
if(age > 18 && hasCard){}
  1. switch
    只能做等值匹配,不能判断区间、大小关系;
    支持的数据类型:byte/short/int/char/String(JDK7+)/枚举
    不支持 long、float、double、布尔、区间表达式。
// 合法
switch(week){
    case 1:
}
// 非法,不能写范围
switch(score){
    case score>60:
}

二、执行机制差异

  1. if-else if
    从上往下依次判断,满足条件执行对应代码,互不干扰,不存在穿透问题。

  2. switch
    匹配对应 case 后,没有 break 会发生 case 穿透,后续所有case代码会全部执行,直到遇到 break;
    Java14+箭头写法 -> 自动阻断穿透,不用写break。

穿透示例:

int a=1;
switch(a){
    case 1:System.out.println("一");
    case 2:System.out.println("二"); break;
}
// 输出:一 二

三、性能差异

  • 分支少:两者性能几乎无差别;
  • 大量固定值分支:switch底层生成跳转表,查找更快;if-else 需要逐个判断,越靠后效率越低。

四、可读性与适用场景

  1. 优先用 switch
    变量等于若干固定常量:星期、等级、状态码、月份等等值多选一场景,代码简洁清晰。
  2. 优先用 if-else
    数值区间判断、多条件叠加、大于小于、复杂逻辑判断。

五、对比表格

对比维度 if-else switch
判断逻辑 任意布尔表达式(区间、逻辑与或) 仅等值 == 匹配
支持类型 无限制,只要返回true/false byte/short/int/char/String/枚举
穿透问题 无穿透 无break会穿透
多分支效率 逐行判断,分支多变慢 跳转表,大量分支更快
典型场景 分数区间、年龄判断、复合条件 星期、等级、固定状态值

简短总结

  1. 要判断范围、多个复杂条件 → if-else
  2. 变量只和几个固定常量做相等对比 → switch

更多推荐