switch语句语法
switch (expression) {
case value:
//语句
break;//可选
//可以有任意个case语句
default://可选
//语句
}
注意点
switch的语句中表达式expression返回类型只能是byte、char、short、int以及他们的包装类型和枚举类型,java1.7开始支持String类型;
case语句值的类型必须与表达式expression的类型相同,并且是字面量或者是常量。
执行过程
从上到下进行匹配,一旦匹配到了,后面的语句块都执行,直到执行完或者遇到break;
案例分析
今天在牛客网上刷到一个题目,下面代码的输出结果是什么:
int v1 = 0, v2 = 0, v3 = 0, v4 = 0;
String str = "1314520";
char[] s = str.toCharArray();
for (int i = 0; i < s.length; i++) {
switch (s[i]) {
default:
v4++;
case '1':
v1++;
case '2':
v2++;
case '3':
v3++;
}
}
System.out.printf("%d,%d,%d,%d", v4, v1, v2, v3);
结果是3,5,6,7,是不是跟你的结果完全不一样?
下面我们来分析程序的执行过程:
第一轮:s[i]=s[0]='1',会执行v1++;v2++;v3++;这时候v1=1,v2=1,v3=1,v4=0
第二轮:s[i]=s[1]='3',会执行v3++;这时候v1=1,v2=1,v3=2,v4=0
第三轮:s[i]=s[2]='1',会执行v1++;v2++;v3++;这时候v1=2,v2=2,v3=3,v4=0
第四轮:s[i]=s[3]='4',会执行v4++;v1++;v2++;v3++;这时候v1=3,v2=3,v3=4,v4=1
第五轮:s[i]=s[4]='5',会执行v4++;v1++;v2++;v3++;这时候v1=4,v2=4,v3=5,v4=2
第六轮:s[i]=s[5]='2',会执行v2++;v3++;这时候v1=4,v2=5,v3=6,v4=2
第七轮:s[i]=s[6]='0',会执行v4++;v1++;v2++;v3++;这时候v1=5,v2=6,v3=7,v4=3
所以最后System.out.printf("%d,%d,%d,%d", v4, v1, v2, v3);输出结果为3,5,6,7
jdk12预览版
在之前的版本中如果没有写break会有case穿透问题,jdk12中会默认break,并且可以case多个值
int month = 3;
switch (month) {
case 3,4,5 -> System.out.println("spring");
case 6,7,8 -> System.out.println("summer");
case 9,10,11 -> System.out.println("autumn");
case 12, 1,2 -> System.out.println("winter");
default -> System.out.println("wrong");
}
jdk13预览版
switch语句有返回值
int month = 3;
String result = switch (month) {
case 3,4,5 -> "spring";
case 6,7,8 -> "summer";
case 9,10,11 -> "autumn";
case 12, 1,2 -> "winter";
default -> "wrong";
};
System.out.println(result);
注意预览版的特性不能直接使用,要加上特殊的参数,两个版本后会成为正式特性