switch语句在开发中经常会用到,它主要用于替换多个if/else语句,提高代码的可读性。基础用法如下
1public class Main {
2
3 public static void main(String[] args) {
4 String condition = "abc";
5 switch (condition) {
6 case "abc": {
7 System.out.println("condition is abc");
8 }
9 break;
10 case "def": {
11 System.out.println("condition is def");
12 }
13 break;
14 default: {
15 System.out.println("condition isn't abc or edf");
16 }
17 }
18 }
19}
需要注意的是,在case代码块,如果命中之后不需要执行下面的case,一定要记得添加break语句。
目前swicth语句支持的类型有
而且值不能为null,另外在Java 7以前,switch语句是不支持字符串类型的,在Java 7及以后,在switch中使用字符串类型,最终编译器会使用字符串的hashCode的方法的值来替换它,最终转化为int类型的switch语句,比如上面的代码,在编译器编译之后,会得到实际逻辑等同于下面这段代码的class字节码。
1public class Main {
2
3 public static void main(String[] args) {
4 String condition = "abc";
5 byte var3 = -1;
6 switch (condition.hashCode()) {
7 case 96354:
8 if (condition.equals("abc")) {
9 var3 = 0;
10 }
11 break;
12 case 99333:
13 if (condition.equals("def")) {
14 var3 = 1;
15 }
16 }
17 switch (var3) {
18 case 0:
19 System.out.println("condition is abc");
20 break;
21 case 1:
22 System.out.println("condition is def");
23 break;
24 default:
25 System.out.println("condition isn't abc or edf");
26 }
27
28 }
29}
随着Java版本的不断迭代,在Java 13以后,switch语句终于有了比较大的变化,变得更加好用,比如说,可以多个case写在一起,通过->符号可以省略break语句,还可以将switch语句作为表达式使用。下面看看具体的示例。
在Java12中通过设置编译参数–enable-preview也可以实现
注释1public class Main {
2
3 public static void main(String[] args) {
4 String condition = "abc";
5 switch (condition) {
6 case "abc", "abd" -> System.out.println("condition is abc or abd");
7 case "def" -> System.out.println("condition is def");
8 default -> System.out.println("condition isn't abc or edf");
9 }
10 int state = 1;
11 String res = switch(state) {
12 case 0, 1 -> "success";
13 case 2 -> "failure";
14 default -> "unknown";
15 };
16 System.out.println(res);
17 /**
18 * 如果case语句返回的不是表达式,可以通过yield返回值
19 */
20 state = 2;
21 res = switch(state) {
22 case 0, 1 -> "success";
23 case 2 -> {
24 System.out.println("test");
25 yield "failure";
26 }
27 default -> "unknown";
28 };
29 System.out.println(res);
30 }
31}