Java switch 与 if-else 核心区别
一、判断条件限制不同
- if-else
支持任意布尔表达式:等值、区间、多条件逻辑组合(> < >= <= && || !=),几乎所有判断场景都能用。
示例:
if(score>=60&&score<90){}if(age>18&&hasCard){}- switch
只能做等值匹配,不能判断区间、大小关系;
支持的数据类型:byte/short/int/char/String(JDK7+)/枚举;
不支持 long、float、double、布尔、区间表达式。
// 合法switch(week){case1:}// 非法,不能写范围switch(score){casescore>60:}二、执行机制差异
if-else if
从上往下依次判断,满足条件执行对应代码,互不干扰,不存在穿透问题。switch
匹配对应 case 后,没有 break 会发生 case 穿透,后续所有case代码会全部执行,直到遇到 break;
Java14+箭头写法->自动阻断穿透,不用写break。
穿透示例:
inta=1;switch(a){case1:System.out.println("一");case2:System.out.println("二");break;}// 输出:一 二三、性能差异
- 分支少:两者性能几乎无差别;
- 大量固定值分支:switch底层生成跳转表,查找更快;if-else 需要逐个判断,越靠后效率越低。
四、可读性与适用场景
- 优先用 switch
变量等于若干固定常量:星期、等级、状态码、月份等等值多选一场景,代码简洁清晰。 - 优先用 if-else
数值区间判断、多条件叠加、大于小于、复杂逻辑判断。
五、对比表格
| 对比维度 | if-else | switch |
|---|---|---|
| 判断逻辑 | 任意布尔表达式(区间、逻辑与或) | 仅等值 == 匹配 |
| 支持类型 | 无限制,只要返回true/false | byte/short/int/char/String/枚举 |
| 穿透问题 | 无穿透 | 无break会穿透 |
| 多分支效率 | 逐行判断,分支多变慢 | 跳转表,大量分支更快 |
| 典型场景 | 分数区间、年龄判断、复合条件 | 星期、等级、固定状态值 |
简短总结
- 要判断范围、多个复杂条件 →
if-else - 变量只和几个固定常量做相等对比 →
switch