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的代码,直到遇到breakswitch语句结束。

示例:缺少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语句的表达式可以是以下类型:

  • 基本类型:byteshortcharint
  • 包装类型:ByteShortCharacterInteger
  • 枚举类型(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多重选择的更多相关文章

  1. Java流程控制,for,switch,while.break,continue,return

    Java流程控制,for,switch,while.break,continue,return

  2. Java流程控制04——Switch选择结构

    switch 多选择结构 switch case 语句判断一个变量与一系列值中某个值是否相等,每个支撑位一个分支. switch语句中的变量类型可以是: byte short int 或者 char ...

  3. Java流程控制以及顺序、选择、循环结构

    目录 用户交互Scanner Scanner对象 hasNext()与next() hasNextLine()与nextLine() Scanner进阶用法 求和与平均数 顺序结构 选择结构 if单选 ...

  4. Java流程控制之顺序结构+选择结构

    顺序结构 Java的基本结构就是顺序结构,除非特别指明,否则就按照顺序一句一句执行. 顺序结构是最简单的算法结构. 语句与语句之间,框与框之间是按从上到下的顺序进行的,它是有若干个依次执行的处理步骤组 ...

  5. 第二节 java流程控制(判断结构+选择结构)

    Java的判断结构: 1.if(条件表达式){ 执行语句 }: 2.if(条件表达式){ 执行语句 }else{ 执行语句 } 3. if(条件表达式){ 执行语句 }else if(条件表达式){ ...

  6. JAVA 流程控制之选择语句

    在程序设计时,有三种基本技术可以改变程序的流程控制: 调用方法: 选择: 循环. 在这里,我们主要来讲讲选择语句. JAVA中的选择语句与C语言中的基本相同,包括: if 语句: if/else 语句 ...

  7. 038 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 05 案例演示switch结构-星期的表示案例以及总结

    038 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 05 案例演示switch结构-星期的表示案例以及总结 本文知识点:案例演示switch结构并对sw ...

  8. 037 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 04 switch结构

    037 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 04 switch结构 本文知识点:Java中的switch结构 选择结构分类 选择结构只有如下2种 ...

  9. 035 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 02 多重if结构

    035 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 02 多重if结构 本文知识点:Java中的多重if结构 选择结构回顾 if选择结构 注意: 1.条 ...

  10. 034 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 01 流程控制概述

    034 01 Android 零基础入门 01 Java基础语法 04 Java流程控制之选择结构 01 流程控制概述 本文知识点:Java中的流程控制相关概念的认识 三大流程控制语句结构的简介 顺序 ...

随机推荐

  1. Spring 注解之 @EnableTransactionManagement:Spring Boot 事务配置

    Spring Boot 开启声明式事务支持 所有的数据访问技术都有事务处理机制,这些技术提供了API用来开启事务.提交事务以完成数据操纵,或者在发生错误的时候回滚数据.Spring支持声明式事务,这是 ...

  2. 华为MAAS、阿里云PAI、亚马逊AWS SageMaker、微软Azure ML各大模型深度分析对比

    一.技术架构深度对比 1. 硬件基础设施 平台 自研芯片 分布式训练方案 边缘协同能力 华为MAAS 昇腾Ascend 910 + Atlas 900集群 MindSpore + HCCL(华为集合通 ...

  3. 渗透中的逆向工具-jsrpc实操手记

    前言 在渗透测试过程中,有些网站的接口参数是加密的.对于逆向小菜鸡的我来说,遇到这种网站总是束手无策,不能修改其中的参数,也就无法进行下一步的测试.偶然间发现一款js逆向工具jsrpc,它可以直接调用 ...

  4. FastAPI权限配置:你的系统真的安全吗?

    url: /posts/96b6ede65030daa4613ab92da1d739a6/ title: FastAPI权限配置:你的系统真的安全吗? date: 2025-06-26T07:35:3 ...

  5. DotTrace系列:9. 大结局之 跨平台 和 自定义行为 诊断

    一:背景 1. 讲故事 本篇是系列的最后一篇,我们从跨平台部署和自定义诊断的角度跟大家聊一聊 dottrace,希望对大家有所启发. 二:跨平台和自定义诊断 1. 如何跨平台诊断分析 如果 dottr ...

  6. Kafka入门实战教程(5):吞吐量与可靠性的实践

    1 提高Producer吞吐量的实践 在实际环境中,用户似乎总是愿意用较小的延时增加的代价,去换取 TPS 的显著提升.毕竟,从 2ms 到 10ms 的延时增加通常是可以忍受的. 事实上,Kafka ...

  7. 使用 cursor 来 review 代码

    使用 cursor 来 review 代码 前言 code review review 单个文件 针对提交进行 code review 总结 使用 cursor 来 review 代码 前言 curs ...

  8. AI领域又新增协议: AG-UI

    随着AI的快速发展正在重塑技术生态,协议的演进速度尤为迅猛.一个令人头疼的问题浮现了:不同的AI智能体和前端应用之间就像说着不同语言的人,无法顺畅交流.开发者们需要为每个智能体单独编写接口,维护成本高 ...

  9. mysql 笛卡尔积

    简介 新生成的表的行数 第一个表的行数 * 第二个表的行数 参考链接 mysql 必知必会

  10. idea 学会看log文件

    简介 在 help -> show Log in Explore 可以看到log文件 可以更具log文件查找错误 TIPS maven的配置信息 主要配置两个信息 一个是镜像的配置 另一个是包目 ...