switch语句
switch是多分支选择结构。
switch基本语法
switch结构
Java
switch (表达式) {
case 值1:
// 执行代码
break;
case 值2:
// 执行代码
break;
default:
// 默认执行代码
}
基本示例
Java
int day = 3;
switch (day) {
case 1:
System.out.println("星期一");
break;
case 2:
System.out.println("星期二");
break;
case 3:
System.out.println("星期三");
break;
default:
System.out.println("其他");
}
// 输出:星期三
switch执行流程
执行过程
Java
1. 计算switch表达式的值
2. 从上到下匹配case值
3. 找到匹配的case,执行其代码
4. 遇到break跳出switch
5. 无匹配则执行default
break的作用
Java
int num = 2;
switch (num) {
case 1:
System.out.println("一");
break; // 跳出switch
case 2:
System.out.println("二");
break; // 跳出switch
case 3:
System.out.println("三");
break;
}
// 输出:二(遇到break停止)
穿透现象(无break)
Java
int num = 2;
switch (num) {
case 1:
System.out.println("一");
case 2:
System.out.println("二"); // 无break,继续执行
case 3:
System.out.println("三");
}
// 输出:二、三(穿透执行)
无break会继续执行后续case代码,直到遇到break或switch结束。
switch支持类型
支持的类型
- byte、short、int、char
- String(Java 7+)
- enum(枚举)
Java
// int类型
int num = 1;
switch (num) {
case 1: break;
case 2: break;
}
// char类型
char grade = 'A';
switch (grade) {
case 'A': break;
case 'B': break;
}
// String类型(Java 7+)
String name = "张三";
switch (name) {
case "张三": break;
case "李四": break;
}
// enum枚举
enum Color { RED, GREEN, BLUE }
Color color = Color.RED;
switch (color) {
case RED: break;
case GREEN: break;
}
不支持的类型
Java
// 错误:不支持boolean
// boolean flag = true;
// switch (flag) { } // 编译错误
// 错误:不支持double
// double d = 1.5;
// switch (d) { } // 编译错误
// 错误:不支持long
// long l = 100L;
// switch (l) { } // 编译错误
case合并
多个case共享代码
Java
int month = 2;
switch (month) {
case 1: case 2: case 3:
System.out.println("第一季度");
break;
case 4: case 5: case 6:
System.out.println("第二季度");
break;
case 7: case 8: case 9:
System.out.println("第三季度");
break;
case 10: case 11: case 12:
System.out.println("第四季度");
break;
}
case合并示例
Java
char grade = 'B';
switch (grade) {
case 'A': case 'B': case 'C':
System.out.println("通过");
break;
case 'D': case 'F':
System.out.println("未通过");
break;
default:
System.out.println("无效等级");
}
default默认分支
default作用
无匹配case时执行default。
Java
int num = 5;
switch (num) {
case 1:
System.out.println("一");
break;
case 2:
System.out.println("二");
break;
default:
System.out.println("其他数字"); // 执行default
}
default位置
Java
// default可在任意位置(建议放最后)
int num = 5;
switch (num) {
default:
System.out.println("其他");
break; // 需要break,否则穿透
case 1:
System.out.println("一");
break;
}
// 推荐:放在最后
switch (num) {
case 1: break;
case 2: break;
default: break; // 最后可省略break
}
Java 14+新语法
箭头语法
Java
int day = 3;
// 箭头语法:无需break
switch (day) {
case 1 -> System.out.println("星期一");
case 2 -> System.out.println("星期二");
case 3 -> System.out.println("星期三");
default -> System.out.println("其他");
}
// 箭头语法代码块
switch (day) {
case 1 -> {
System.out.println("星期一");
doSomething();
}
case 2 -> System.out.println("星期二");
default -> System.out.println("其他");
}
多值匹配
Java
int month = 2;
// Java 14+:多值匹配
switch (month) {
case 1, 2, 3 -> System.out.println("第一季度");
case 4, 5, 6 -> System.out.println("第二季度");
case 7, 8, 9 -> System.out.println("第三季度");
case 10, 11, 12 -> System.out.println("第四季度");
}
switch表达式返回值
Java
int day = 3;
// switch表达式返回结果
String name = switch (day) {
case 1 -> "星期一";
case 2 -> "星期二";
case 3 -> "星期三";
default -> "其他";
};
// 使用yield返回(块内)
String name2 = switch (day) {
case 1 -> "星期一";
case 2 -> {
String result = "星期二";
yield result; // yield返回结果
}
default -> "其他";
};
switch应用示例
星期判断
Java
int day = 3;
String dayName;
switch (day) {
case 1: dayName = "星期一"; break;
case 2: dayName = "星期二"; break;
case 3: dayName = "星期三"; break;
case 4: dayName = "星期四"; break;
case 5: dayName = "星期五"; break;
case 6: dayName = "星期六"; break;
case 7: dayName = "星期日"; break;
default: dayName = "无效"; break;
}
季节判断
Java
int month = 7;
switch (month) {
case 3: case 4: case 5:
System.out.println("春季");
break;
case 6: case 7: case 8:
System.out.println("夏季");
break;
case 9: case 10: case 11:
System.out.println("秋季");
break;
case 12: case 1: case 2:
System.out.println("冬季");
break;
}
命令处理
Java
String command = "start";
switch (command) {
case "start":
startService();
break;
case "stop":
stopService();
break;
case "restart":
stopService();
startService();
break;
default:
System.out.println("未知命令");
}
switch与if-else对比
对比选择
| 特性 | switch | if-else |
|---|---|---|
| 判断方式 | 值匹配 | 条件判断 |
| 支持类型 | 有限类型 | boolean表达式 |
| 分支数量 | 多固定值分支好 | 复杂条件好 |
| 性能 | 多分支略高 | 灵活 |
| 穿透 | 可利用穿透 | 无穿透 |
Java
// 适合switch:固定值匹配
switch (day) {
case 1: case 2: case 3: ...
}
// 适合if-else:范围判断、复杂条件
if (score >= 90) {
...
} else if (score >= 80) {
...
}
switch注意事项
case值必须常量
Java
int num = 2;
int value = 1;
// 正确:case值是常量
switch (num) {
case 1: break;
case 2: break;
}
// 错误:case值不能是变量
// switch (num) {
// case value: break; // 编译错误
// }
case值不能重复
Java
// 错误:case值重复
// switch (num) {
// case 1: break;
// case 1: break; // 编译错误:重复
// }
不要忘记break
text
// 常见错误:忘记break导致穿透
switch (num) {
case 1:
System.out.println("一");
// 忘记break,继续执行
case 2:
System.out.println("二"); // 也被执行
break;
}
要点总结
- switch根据表达式值匹配case执行
- 支持byte/short/int/char/String/enum
- break跳出switch,无break会穿透
- default处理无匹配情况
- case可合并共享代码
- case值必须是常量,不能重复
- 不支持boolean/long/double/float
- Java 14+支持箭头语法、多值匹配
- Java 14+switch可返回值
- 固定值匹配用switch,范围判断用if-else
- 注意忘记break导致穿透问题
📝 发现内容有误?点击此处直接编辑