switch-case

Posted 高高for 循环

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了switch-case相关的知识,希望对你有一定的参考价值。

switch-case

1.格式

在这里插入图片描述

2.说明:

  1. 根据switch表达式中的值,依次匹配各个case中的常量。一旦匹配成功,则进入相应case结构中,调用其执行语句。 当调用完执行语句以后,则仍然继续向下执行其他case结构中的执行语句, 直到遇到break关键字或此switch-case结构 末尾结束为止。
  2. break,可以使用在switch-case结构中,表示一旦执行到此关键字,就跳出switch-case结构
  3. switch结构中的表达式,只能是如下的6种数据类型之一:
    byte 、
    short、
    char、
    int、
    枚举类型(JDK5.0新增)、
    String类型(JDK7.0新增)
  4. case 之后只能声明常量。不能声明范围。
  5. break关键字是可选的
  6. default:相当于if-else结构中的else. default结构是可选的,而且位置是灵活的。
    在这里插入图片描述

案例1:

    @Test
    public 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 :

   @Test
    public 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分的,输出“不合格”

@Test
    public 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 语句对比

在这里插入图片描述

说明:

  1. 凡是可以使用switch-case的结构,都可以转换为if-else。反之,不成立。
  2. 我们写分支结构时,当发现既可以使用switch-case,(同时,switch中表达式的取值情况不太多), 又可以使用if-else时,我们优先选择使用switch-case。原因:switch-case执行效率稍高

以上是关于switch-case的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Kotlin 中实现 switch-case 语句

使用switch-case结构来计算键入数字的次数

使用函数指针和多态代替冗长的if-else或者switch-case

if-else和switch-case哪个效率更高?看这四张图。

Switch-case语句

switch-case