switch-case
1.格式
2.说明:
- 根据switch表达式中的值,依次匹配各个case中的常量。一旦匹配成功,则进入相应case结构中,调用其执行语句。 当调用完执行语句以后,则仍然继续向下执行其他case结构中的执行语句, 直到遇到break关键字或此switch-case结构 末尾结束为止。
- break,可以使用在switch-case结构中,表示一旦执行到此关键字,就跳出switch-case结构
- switch结构中的表达式,只能是如下的6种数据类型之一:
byte 、
short、
char、
int、
枚举类型(JDK5.0新增)、
String类型(JDK7.0新增) - case 之后只能声明常量。不能声明范围。
- break关键字是可选的。
- default:相当于if-else结构中的else. default结构是可选的,而且位置是灵活的。
案例1:
@Testpublic void test01() {int number = 2;switch(number){case 0:System.out.println("zero");case 1:System.out.println("one");case 2:System.out.println("two");case 3:System.out.println("three");default:System.out.println("other");}}
穿透:
在没有break关键字的情况下 ,匹配成功后,仍然继续向下执行其他case结构中的执行语句.
直到遇到break关键字或此switch-case结构 末尾结束为止。
案例 2 :
@Testpublic void test01() {String season = "summer";switch (season) {case "spring":System.out.println("春暖花开");break;case "summer":System.out.println("夏日炎炎");break;case "autumn":System.out.println("秋高气爽");break;case "winter":System.out.println("冬雪皑皑");break;default:System.out.println("季节输入有误");break;}}
经典例题;
如果switch-case结构中的多个case的执行语句相同,则可以考虑进行合并。
例题 1:
对学生成绩大于60分的,输出“合格”。低于60分的,输出“不合格”
@Testpublic void test01() {int score = 78;switch (score / 10) {case 0:case 1:case 2:case 3:case 4:case 5:System.out.println("不及格");break;case 6:case 7:case 8:case 9:case 10:System.out.println("及格");break;}//更优的解决方案:switch(score / 60){case 0:System.out.println("不及格");break;case 1:System.out.println("及格");break;}}
例题 2:
从键盘分别输入年、月、日,判断这一天是当年的第几天
方式一: 用if -else 写起来比较冗余
import java.util.Scanner;
class SwitchCaseTest2 {public static void main(String[] args) {Scanner scan = new Scanner(System.in);System.out.println("请输入2019年的month:");int month = scan.nextInt();System.out.println("请输入2019年的day:");int day = scan.nextInt();//定义一个变量来保存总天数int sumDays = 0;//方式一:冗余if(month == 1){sumDays = day;}else if(month == 2){sumDays = 31 + day;}else if(month == 3){sumDays = 31 + 28 + day;}else if(month == 4){sumDays = 31 + 28 + 31 + day;}//...else{//month == 12//sumDays = ..... + day;}}
}
方式二:冗余
class SwitchCaseTest2 {public static void main(String[] args) {Scanner scan = new Scanner(System.in);System.out.println("请输入2019年的month:");int month = scan.nextInt();System.out.println("请输入2019年的day:");int day = scan.nextInt();//定义一个变量来保存总天数int sumDays = 0;switch(month){case 1:sumDays = day;break;case 2:sumDays = 31 + day;break;case 3:sumDays = 31 + 28 + day;break;...}}
}
注:判断一年是否是闰年的标准:
1)可以被4整除,但不可被100整除 或
2)可以被400整除
方式三: switch-case优解:
class SwitchCaseExer {public static void main(String[] args) {Scanner scan = new Scanner(System.in);System.out.println("请输入year:");int year = scan.nextInt();System.out.println("请输入month:");int month = scan.nextInt();System.out.println("请输入day:");int day = scan.nextInt();//定义一个变量来保存总天数int sumDays = 0;switch(month){case 12:sumDays += 30;case 11:sumDays += 31;case 10:sumDays += 30;case 9:sumDays += 31;case 8:sumDays += 31;case 7:sumDays += 30;case 6:sumDays += 31;case 5:sumDays += 30;case 4:sumDays += 31;case 3://sumDays += 28;//判断year是否是闰年if((year % 4 == 0 && year % 100 != 0 ) || year % 400 == 0){sumDays += 29;}else{sumDays += 28;}case 2:sumDays += 31;case 1:sumDays += day;}System.out.println(year + "年" + month + "月" + day + "日是当年的第" + sumDays + "天");}
}
switch 和 if 语句对比
说明:
- 凡是可以使用switch-case的结构,都可以转换为if-else。反之,不成立。
- 我们写分支结构时,当发现既可以使用switch-case,(同时,switch中表达式的取值情况不太多), 又可以使用if-else时,我们优先选择使用switch-case。原因:switch-case执行效率稍高。