本篇文章参考了大佬文章,感谢大佬无私分享:
http://t.csdnimg.cn/MjZnX
http://t.csdnimg.cn/QFg0x
目录
一、Switch用法:JDK7及以前
1.1、举例一:
1.2、举例二:
二、Switch穿透:
2.1、举例:
三、Switch用法:JDK12及以后
3.1、举例一:
3.2、举例二:
3.3、举例三:
3.4、举例四:(最完美的例子)
3.5、Switch、Record、yield实现复杂计算举例:
一、Switch用法:JDK7及以前
1、switch中的表达式的数据的数据类型为byte,short,int,char,String(jdk>1.7支持String类型)
2、default可以放在任意一行,但是不管放在那一行,都会先找第一个case去匹配,如果所有的case都不匹配,才会执行default,default可以省略不写,建议写上。
3、break可以不写,就容易造成switch的穿透现象
在JDK7以前,switch内的值仅支持byte、short、int、char类型或者枚举,在JDK7及以后,引入了对String类型的switch判断。代码如下:
1.1、举例一:
String match = "中国";switch (match){case "中国":System.out.println("China");break;case "日本":System.out.println("鬼砸");break;}
1.2、举例二:
import java.util.Scanner;public class SwitchDemo {public static void main(String[] args) {/** 用户输入一个整数(月份),判断该月份处于什么季节?*/System.out.println("enter a month:");Scanner input = new Scanner(System.in); //接收输入流,采用标准输入流int month = input.nextInt();switch (month){case 12:case 1:case 2:System.out.println("winter");break;case 3:case 4:case 5:System.out.println("spring");break;case 6:case 7:case 8:System.out.println("summer");break;case 9:case 10:case 11:System.out.println("autumn");break;default:System.out.println("您输入的月份错误!");}input.close(); //资源释放}
}
二、Switch穿透:
2.1、举例:
int state =2;switch (state) {case 1:System.out.println("1");case 2:System.out.println("2");case 3:System.out.println("3");default:System.out.println("4");break;}
输出结果为:2,3,4;即使state不为3和4,因为2中匹配后没有break,则后续代码则不会进行case判断,直到遇到break为止。
三、Switch用法:JDK12及以后
在使用switch时有可能会出现”switch穿透“现象。如果你遗漏了break语句,有可能会造成严重的逻辑错误,所以为了防止意外出现”switch穿透“,从JDK 12开始,switch语句升级成了更简单的表达式语法,不再需要我们手动添加break语句。
switch新特性:
1、在JDK 12的switch语句中,不用再写break语句,不会再出现switch的穿透现象;
2、如果case后面只有一条语句,可以直接在->后面编写该语句;如果有多条语句,需要用{} 括起来,当然也可以不使用->符号,继续采用以前的写法“:”也没问题;(下文有举例说明),但是 case 标签-> 与 case 标签不能同时混用;
3、JDK 13:完善了带返回值的switch语句,增加关键字yield;
4、如果只有一条语句,yield关键字可以省略:
3.1、举例一:
public class Demo01 {public static void main(String[] args) {// switch结构-case穿透System.out.println("请选择你的国家");Scanner sc = new Scanner(System.in);String country = sc.next();switch (country) {case "中国" -> System.out.println("我是中国人,我自豪!");case "日本" -> System.out.println("鬼子脚盆鸡");case "美国" -> {System.out.println("暂时还是老大");System.out.println("喜欢欺负人");}default -> System.out.println("未知国籍,黑户");}}}
3.2、举例二:
import java.util.Scanner;public class SwitchDemo {public static void main(String[] args) {/** 用户输入一个整数(月份),判断该月份处于什么季节?*/System.out.println("(switch新特性)enter a month:");Scanner input = new Scanner(System.in); //接收输入流,采用标准输入流int month = input.nextInt();switch (month) {case 12, 1, 2 ->System.out.println("winter");case 3, 4, 5 ->System.out.println("spring");case 6, 7, 8 ->System.out.println("summer");case 9, 10, 11 ->System.out.println("autumn");default -> System.out.println("非法月份!");}input.close(); //资源释放}
}
3.3、举例三:
@Testpublic void testRecord08(){int week = 7;String memo = "";switch(week){case 1 -> memo = "今天是星期一,开始新的一周的工作了";case 2,3,4,5,6 -> memo = "今天是工作日,搬砖";case 7 -> memo = "今天星期七,休息咯";default -> throw new IllegalArgumentException("无效日期");}System.out.println(memo);}
3.4、举例四:(最完美的例子)
JDK 13:完善了带返回值的switch语句,增加关键字yield,yield让 switch 作为表达式,能够返回值,即yield作为switch表达式的返回值;
在JDK 12的switch语句中,支持使用->符号,当然也可以不使用->符号,继续采用以前的写法“:”也没问题:
@Testpublic void testSwitch() {int week = 2;String memo = switch(week){case 1 : yield "星期一,工作";case 2,3,4,5,6 : yield "工作日,继续工作";case 7 : yield "星期七,休息咯";default: yield "无效日期";};System.out.println(memo);}
如果只有一条语句,yield关键字可以省略:
import java.util.Scanner;
public class SwitchExpression {public static void main(String[] args) {/** 用户输入年份,判断十二生肖* 0-11表示十二生肖,以monkey开始*/System.out.println("(switch新特性)enter a year:");Scanner input = new Scanner(System.in); //标准输入流int year = input.nextInt(); //接收用户键盘输入的整数 year:年String zodiac = switch(year % 12) { //注意这里switch表达式是有返回值的,且是必须的case 0 -> "monkey"; //这里如果只有一条语句,返回的关键字是可以省略的,而且自带breakcase 1 -> "roster";case 2 -> "dog";case 3 -> { //注意如果需要多条语句,需要在花括号内进行,在switch表达式中,如果多条语句,最后的值返回需要使用yield关键字进行返回System.out.println("计算选择器case == 3 的情况");yield "pig"; //注意这里返回的关键字不是return,而是yield} case 4 -> "mouse";case 5 -> "ox";case 6 -> "tiger";case 7 -> "rabbit";case 8 -> "dragon";case 9 -> "snake";case 10 -> "horse";case 11 -> "sheep";default -> ""; //注意switch表达式的值必须是穷尽的,故defalult不能省略};input.close(); //资源释放System.out.println(year + " is " + zodiac);}}
3.5、Switch、Record、yield实现复杂计算举例:
没学过新特性Record的同学可以看本人此篇文章:http://t.csdnimg.cn/2a8pE
@Testpublic void testSwitch01(){Line line = new Line(10,20);Rectangle rectangle = new Rectangle(20,50);Shape shape = new Shape(50,80);Object obj = line;int result = switch(obj){case Line(int x, int y)->{System.out.println("图象是Line,x:" + x + ", y:" + y);yield x + y;}case Rectangle(int w, int h)-> 2*(w + h);case Shape(int x, int y)->{System.out.println("图像是shape");yield x*y;}default -> 0;};System.out.println("result = " + result);}