Java流程控制——3.switch多重选择
Java中的switch语句:多重选择的高效实现
在Java编程中,当需要根据一个表达式的不同结果执行不同代码块时,switch语句提供了比if-else if结构更清晰、更高效的解决方案。
switch语句的基本用法
switch语句通过判断一个表达式的结果,从多个分支中选择一个匹配的分支执行。其基本语法结构如下:
switch (表达式) {
case 值1:
// 当表达式结果等于值1时执行的代码
break;
case 值2:
// 当表达式结果等于值2时执行的代码
break;
// 更多case分支...
default:
// 当没有任何case匹配时执行的代码
break;
}
示例:
public class SwitchBasicExample {
public static void main(String[] args) {
int option = 2;
switch (option) {
case 1:
System.out.println("选择了1");
break;
case 2:
System.out.println("选择了2");
break;
case 3:
System.out.println("选择了3");
break;
default:
System.out.println("选择了其他选项");
break;
}
}
}
上述代码中,switch语句判断option变量的值,当值为2时,执行case 2后的代码,然后遇到break语句退出switch结构。
switch的特性
case穿透性与break语句
switch语句最需要注意的特性是case穿透性:当某个case分支被匹配后,如果没有break语句,程序会继续执行后续所有case的代码,直到遇到break或switch语句结束。
示例:缺少break导致的穿透
public class SwitchFallthroughExample {
public static void main(String[] args) {
int option = 2;
switch (option) {
case 1:
System.out.println("选择了1");
case 2:
System.out.println("选择了2");
case 3:
System.out.println("选择了3");
default:
System.out.println("选择了其他选项");
}
}
}
运行结果:
选择了2
选择了3
选择了其他选项
由于所有case都没有break语句,程序从case 2开始连续执行了所有后续代码。因此,在绝大多数情况下,每个case分支都应该以break语句结束。
多个case共享代码块
如果多个case需要执行相同的代码,可以将它们连续书写,共享同一个代码块:
public class SwitchSharedCaseExample {
public static void main(String[] args) {
int month = 2;
switch (month) {
case 12:
case 1:
case 2:
System.out.println("冬季");
break;
case 3:
case 4:
case 5:
System.out.println("春季");
break;
// 其他季节...
default:
System.out.println("未知季节");
}
}
}
上述代码中,12月、1月和2月都将执行"冬季"的输出语句。
default分支
default分支是可选的,当没有任何case分支与表达式结果匹配时,会执行default分支的代码。建议总是添加default分支来处理意外情况,提高程序的健壮性。
public class SwitchDefaultExample {
public static void main(String[] args) {
String day = "Sunday";
switch (day) {
case "Monday":
case "Tuesday":
case "Wednesday":
case "Thursday":
case "Friday":
System.out.println("工作日");
break;
case "Saturday":
case "Sunday":
System.out.println("休息日");
break;
default:
System.out.println("无效的日期");
break;
}
}
}
支持的表达式类型
switch语句的表达式可以是以下类型:
- 基本类型:
byte、short、char、int - 包装类型:
Byte、Short、Character、Integer - 枚举类型(Enum)
- 字符串类型(String)
字符串类型的switch示例
public class SwitchStringExample {
public static void main(String[] args) {
String fruit = "apple";
switch (fruit) {
case "apple":
System.out.println("苹果");
break;
case "banana":
System.out.println("香蕉");
break;
case "orange":
System.out.println("橙子");
break;
default:
System.out.println("未知水果");
break;
}
}
}
字符串的匹配基于内容相等性(相当于equals()方法),而不是引用相等性。
Java 12+的switch表达式新特性
从Java 12开始,switch升级为表达式形式,引入了新的语法和特性,解决了传统switch的一些痛点。
新语法:箭头符号->
新语法使用->替代了传统的冒号:,并且不需要break语句,因为新语法默认不会发生穿透:
public class SwitchExpressionExample {
public static void main(String[] args) {
String fruit = "mango";
switch (fruit) {
case "apple" -> System.out.println("选择了苹果");
case "banana" -> System.out.println("选择了香蕉");
case "mango" -> {
System.out.println("选择了芒果");
System.out.println("这是热带水果");
}
default -> System.out.println("选择了其他水果");
}
}
}
当分支代码超过一行时,需要用{}包裹。
作为表达式返回值
新的switch表达式可以直接作为值返回,赋值给变量:
public class SwitchReturnValueExample {
public static void main(String[] args) {
String fruit = "apple";
int price = switch (fruit) {
case "apple" -> 5;
case "banana" -> 3;
case "mango" -> 8;
default -> 0;
};
System.out.println("价格:" + price);
}
}
多个case可以合并为一行,用逗号分隔:
int price = switch (fruit) {
case "apple", "pear" -> 5;
case "banana", "orange" -> 3;
default -> 0;
};
yield语句
当需要在switch表达式中执行复杂逻辑并返回值时,可以使用yield语句:
public class SwitchYieldExample {
public static void main(String[] args) {
String fruit = "apple";
int discount = switch (fruit) {
case "apple" -> {
System.out.println("苹果有折扣");
yield 10; // 返回折扣值
}
case "banana" -> {
System.out.println("香蕉有折扣");
yield 5;
}
default -> 0;
};
System.out.println("折扣:" + discount + "%");
}
}
yield语句用于从switch表达式中返回一个值,类似于方法中的return。
综合示例:石头剪刀布游戏
import java.util.Scanner;
public class RockPaperScissors {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请选择:1.石头 2.剪刀 3.布");
int playerChoice = scanner.nextInt();
// 电脑随机选择1-3
int computerChoice = (int) (Math.random() * 3) + 1;
System.out.print("电脑选择了:");
printChoice(computerChoice);
System.out.print("你选择了:");
printChoice(playerChoice);
// 判断胜负
String result = switch (playerChoice) {
case 1 -> computerChoice == 1 ? "平局" :
computerChoice == 2 ? "胜利" : "失败";
case 2 -> computerChoice == 1 ? "失败" :
computerChoice == 2 ? "平局" : "胜利";
case 3 -> computerChoice == 1 ? "胜利" :
computerChoice == 2 ? "失败" : "平局";
default -> "无效选择";
};
System.out.println("结果:" + result);
scanner.close();
}
private static void printChoice(int choice) {
switch (choice) {
case 1 -> System.out.println("石头");
case 2 -> System.out.println("剪刀");
case 3 -> System.out.println("布");
default -> System.out.println("无效");
}
}
}
总结
- 传统
switch使用case:和break,需注意穿透性问题 - 支持整数、字符串、枚举等多种类型的表达式
- Java 12+引入的新语法使用
->,无需break,更简洁安全 - 新的
switch表达式可以返回值,支持yield语句处理复杂逻辑 - 合理使用
default分支提高程序健壮性
Java流程控制——3.switch多重选择的更多相关文章
- Java流程控制,for,switch,while.break,continue,return
Java流程控制,for,switch,while.break,continue,return
- Java流程控制04——Switch选择结构
switch 多选择结构 switch case 语句判断一个变量与一系列值中某个值是否相等,每个支撑位一个分支. switch语句中的变量类型可以是: byte short int 或者 char ...
- Java流程控制以及顺序、选择、循环结构
目录 用户交互Scanner Scanner对象 hasNext()与next() hasNextLine()与nextLine() Scanner进阶用法 求和与平均数 顺序结构 选择结构 if单选 ...
- Java流程控制之顺序结构+选择结构
顺序结构 Java的基本结构就是顺序结构,除非特别指明,否则就按照顺序一句一句执行. 顺序结构是最简单的算法结构. 语句与语句之间,框与框之间是按从上到下的顺序进行的,它是有若干个依次执行的处理步骤组 ...
- 第二节 java流程控制(判断结构+选择结构)
Java的判断结构: 1.if(条件表达式){ 执行语句 }: 2.if(条件表达式){ 执行语句 }else{ 执行语句 } 3. if(条件表达式){ 执行语句 }else if(条件表达式){ ...
- JAVA 流程控制之选择语句
在程序设计时,有三种基本技术可以改变程序的流程控制: 调用方法: 选择: 循环. 在这里,我们主要来讲讲选择语句. JAVA中的选择语句与C语言中的基本相同,包括: if 语句: if/else 语句 ...
- 038 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 05 案例演示switch结构-星期的表示案例以及总结
038 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 05 案例演示switch结构-星期的表示案例以及总结 本文知识点:案例演示switch结构并对sw ...
- 037 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 04 switch结构
037 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 04 switch结构 本文知识点:Java中的switch结构 选择结构分类 选择结构只有如下2种 ...
- 035 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 02 多重if结构
035 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 02 多重if结构 本文知识点:Java中的多重if结构 选择结构回顾 if选择结构 注意: 1.条 ...
- 034 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 01 流程控制概述
034 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 01 流程控制概述 本文知识点:Java中的流程控制相关概念的认识 三大流程控制语句结构的简介 顺序 ...
随机推荐
- Spring 注解之 @EnableTransactionManagement:Spring Boot 事务配置
Spring Boot 开启声明式事务支持 所有的数据访问技术都有事务处理机制,这些技术提供了API用来开启事务.提交事务以完成数据操纵,或者在发生错误的时候回滚数据.Spring支持声明式事务,这是 ...
- 华为MAAS、阿里云PAI、亚马逊AWS SageMaker、微软Azure ML各大模型深度分析对比
一.技术架构深度对比 1. 硬件基础设施 平台 自研芯片 分布式训练方案 边缘协同能力 华为MAAS 昇腾Ascend 910 + Atlas 900集群 MindSpore + HCCL(华为集合通 ...
- 渗透中的逆向工具-jsrpc实操手记
前言 在渗透测试过程中,有些网站的接口参数是加密的.对于逆向小菜鸡的我来说,遇到这种网站总是束手无策,不能修改其中的参数,也就无法进行下一步的测试.偶然间发现一款js逆向工具jsrpc,它可以直接调用 ...
- FastAPI权限配置:你的系统真的安全吗?
url: /posts/96b6ede65030daa4613ab92da1d739a6/ title: FastAPI权限配置:你的系统真的安全吗? date: 2025-06-26T07:35:3 ...
- DotTrace系列:9. 大结局之 跨平台 和 自定义行为 诊断
一:背景 1. 讲故事 本篇是系列的最后一篇,我们从跨平台部署和自定义诊断的角度跟大家聊一聊 dottrace,希望对大家有所启发. 二:跨平台和自定义诊断 1. 如何跨平台诊断分析 如果 dottr ...
- Kafka入门实战教程(5):吞吐量与可靠性的实践
1 提高Producer吞吐量的实践 在实际环境中,用户似乎总是愿意用较小的延时增加的代价,去换取 TPS 的显著提升.毕竟,从 2ms 到 10ms 的延时增加通常是可以忍受的. 事实上,Kafka ...
- 使用 cursor 来 review 代码
使用 cursor 来 review 代码 前言 code review review 单个文件 针对提交进行 code review 总结 使用 cursor 来 review 代码 前言 curs ...
- AI领域又新增协议: AG-UI
随着AI的快速发展正在重塑技术生态,协议的演进速度尤为迅猛.一个令人头疼的问题浮现了:不同的AI智能体和前端应用之间就像说着不同语言的人,无法顺畅交流.开发者们需要为每个智能体单独编写接口,维护成本高 ...
- mysql 笛卡尔积
简介 新生成的表的行数 第一个表的行数 * 第二个表的行数 参考链接 mysql 必知必会
- idea 学会看log文件
简介 在 help -> show Log in Explore 可以看到log文件 可以更具log文件查找错误 TIPS maven的配置信息 主要配置两个信息 一个是镜像的配置 另一个是包目 ...