首页 > 编程笔记 > Java笔记 阅读:65

Java switch case语句的用法(非常详细)

Java 中的 switch-case 语句和 if-else 语句类似,称为分支语句,是另外一种可以实现多重分支结构的语句。

switch-case 语句的具体语法结构如下:
switch (表达式) {
  case 值1:
      语句块1;
      [break;]
  case 值2:
      语句块2;
      [break;]
  case 值3:
      语句块3;
      [break;]
  …
  case 值n:
      语句块n;
      [break;]
  default:
      语句块;
}
switch-case 语句的执行流程如下图所示:


图 1 switch-case语句处理流程图

switch 语句中表达式的数据类型可以是 byte、short、char、int 以及其包装类,也可以是 Enum 枚举类,JDK 7 之后还可以是 String 类型。

尽管 switch 语句中表达式扩充了多种数据类型,但是其底层只支持 4 种基本数据类型,其他数据类型都是经过了间接的转换。

switch 语句在执行时,会首先计算表达式的结果,将计算结果与第 1 个 case 后的值 1 做比对,如果比对结果相等则执行该 case 后的语句块 1,如果比对结果不一样则继续和第 2 个 case 后的值 2 做比对,以此类推,如果所有 case 后的值都不匹配则执行 default 后的语句块。

需要注意,case 只是提供 switch 语句匹配成功后的执行入口,case 后的语句块并没有“{}”来标注整体,因此程序执行时并不知道何时该语句块执行完毕。如果匹配上某个 case 后的值,则会从该 case 分支后的语句块一直执行下去,如果没有 break 语句,则后续的 case 分支的语句块也将会执行,直到碰到 break 语句。

综上所述,switch 语句和 else-if 语句的不同之处在于,else-if 的判断条件可以是等值判断,也可以是其他复杂的条件判断,而 switch 只能做等值判断,并且语法结构上来看 switch 语句更简练,表达更清晰。

【实例】输入当前是周几,如果是周一、周三、周五则输出“今天学习”,如果是周二、周四、周六则输出“今天打球”,如果是周日则输出“看电影去,放松一下”,如果都不是则输出“输入错误”。
import java.util.Scanner;

public class Demo {
    public static void main(String[] args) {
        Scanner sca = new Scanner(System.in);
        System.out.println("------请输入今天周几------");
        String week = sca.next();
        switch (week) {
            case "周一":
                System.out.println("今天学习");
                break;
            case "周二":
                System.out.println("今天打球");
                break;
            case "周三":
                System.out.println("今天学习");
                break;
            case "周四":
                System.out.println("今天打球");
                break;
            case "周五":
                System.out.println("今天学习");
                break;
            case "周六":
                System.out.println("今天打球");
                break;
            case "周日":
                System.out.println("看电影去,放松一下");
                break;
            default:
                System.out.println("输入错误");
        }
        System.out.println("switch执行完毕");
    }
}
运行程序,输入“周三”,运行结果如下:

-------请输入今天周几---------
周三
今天学习
switch执行完毕


再次运行程序,输入“周二”,运行结果如下:

-------请输入今天周几---------
周二
今天打球
switch执行完毕


再次运行程序,输入“星期三”,运行结果如下:

-------请输入今天周几---------
星期三
输入错误
switch执行完毕


第 9 行 switch 后的表达式返回的是一个字符串,会和 { } 中的 case 后的值进行逐一比对。

首先与第 10 行的第 1 个 case 后的值做比对:
再次运行程序,当第 3 次录入“星期三”时,也将会依次和各个 case 后的值进行比对,很明显都不匹配,最终执行了 default 后的代码,即输出“输入错误”。

对比 3 次执行结果,发现输入不同的值会有不同结果,switch 会从 case 中选择一个进行执行,如果都不匹配将执行 default 子句后的代码。

在以上案例中,我们可以发现多个 case 语句后的执行语句其实是一样的,即周一、周三、周五输出的都是“今天学习”,周二、周四、周六输出的都是“今天打球”。我们知道 switch 语句中如果某个 case 后的值匹配成功,将会从该 case 后的语句块起一直执行下去,直到遇到 break 语句,因此可以根据这一特点对以上案例进行优化:
import java.util.Scanner;

public class Demo {
    public static void main(String[] args) {
        Scanner sca = new Scanner(System.in);
        System.out.println("--------请输入今天周几--------");
        String week = sca.next();
        switch (week) {
            case "周一":
            case "周三":
            case "周五":
                System.out.println("今天学习");
                break;
            case "周二":
            case "周四":
            case "周六":
                System.out.println("今天打球");
                break;
            case "周日":
                System.out.println("看电影去,放松一下");
                break;
            default:
                System.out.println("输入错误");
        }
        System.out.println("switch执行完毕");
    }
}
运行程序,输入“周三”,运行结果如下:

-------请输入今天周几---------
周三
今天学习
switch执行完毕


再次运行程序,输入“星期三”,运行结果如下:

-------请输入今天周几---------
星期三
输入错误
switch执行完毕

对比以上两段程序,可以看出在输入相同值时运行结果是一样的。执行过程也基本一样,输入“周三”,与第 2 个 case 后的“周三”相等,将执行“周三”后的代码块,但是该 case 后没有相应的语句块,并且没有“break”语句,因此继续执行后续代码,即下一个 case 后的代码。该代码中输出了“今天学习”,还有一个“break语句”,因此在 13 行执行完毕后退出 switch 语句,执行第 23 行代码。

第 2 次输入“星期三”,与所有 case 后的值都不匹配,将执行 default 子句后的代码。

在此需要注意,default 子句的书写并不一定在所有 case 的后面,它只要在 switch 语句中即可,可以在所有 case 前,也可以在最后,也可以穿插在 case 中间。

调整上面实例中 default 子句的位置,将其放到“周四”之前,代码如下:
import java.util.Scanner;

public class Demo {
    public static void main(String[] args) {
        Scanner sca = new Scanner(System.in);
        System.out.println("--------请输入今天周几--------");
        String week = sca.next();
        switch (week) {
            case "周一":
            case "周三":
            case "周五":
                System.out.println("今天学习");
                break;
            case "周二":
            case "周四":
                System.out.println("输入错误");
            case "周六":
                System.out.println("今天打球");
                break;
            case "周日":
                System.out.println("看电影去,放松一下");
                break;
            default:
                System.out.println("输入错误");
        }
        System.out.println("switch执行完毕");
    }
}
运行程序,输入“星期三”,运行结果如下:

-------请输入今天周几---------
星期三
输入错误
今天打球
switch执行完毕

从程序运行结果可发现,在所有 case 后的值都不匹配的情况下,它一样执行了 default 子句后的代码,但是 default 后的代码执行完毕之后又执行了 switch 中后续的代码,即第 19 行的语句,直到碰到的 break 语句才结束了 switch 语句,再次验证了 switch 中每个分支匹配上后执行该分支后的代码,直到碰到 break 为止。

因此,即使 default 不在最后,同样需要添加 break 语句。修改代码如下:
import java.util.Scanner;

public class Demo {
    public static void main(String[] args) {
        Scanner sca = new Scanner(System.in);
        System.out.println("--------请输入今天周几--------");
        String week = sca.next();
        switch (week) {
            case "周一":
            case "周三":
            case "周五":
                System.out.println("今天学习");
                break;
            case "周二":
            case "周四":
            default:
                System.out.println("输入错误");
                break;
            case "周六":
                System.out.println("今天打球");
                break;
            case "周日":
                System.out.println("看电影去,放松一下");
                break;
        }
        System.out.println("switch执行完毕");
    }
}
运行程序,输入“星期三”,运行结果如下:

-------请输入今天周几---------
星期三
输入错误
switch执行完毕

总结

在 switch case 语句中,需要注意以下几点:

相关文章