嵌套 switch 语句

  • Post author:
  • Post category:其他


可以将一个 switch 语句作为一个外部 switch 语句的语句序列的一部分,这称为嵌套 switch 语句。因为一个 switch 语句定义了自己的块,外部 switch 语句和内部 switch 语句的 case 常量不会产生冲突。例如,下面的程序段是完全正确的:


  1. public static void main(String[] args) {
  2. switch (count) {
  3. case 1:
  4. switch (target) {
  5. case 0:
  6. System.out.println(“target is zero”);
  7. break;
  8. case 1:
  9. System.out.println(“target is one”);
  10. break;
  11. }
  12. break;
  13. case 2: // …
  14. }
  15. }

本例中,内部 switch 语句中的

case 1:

语句与外部 switch 语句中的

case 1:

语句不冲突。变量 count 仅与外层的 case 语句相比较。如果变量 count 为 1,则变量 target 与内层的 case 语句相比较。

学到这里我们可以发现以下几点:

  • switch 语句不同于 if 语句的是 switch 语句仅能测试相等的情况,而 if 语句可计算任何类型的布尔表达式。也就是 switch 语句只能寻找 case 常量间某个值与表达式的值相匹配。
  • 在同一个 switch 语句中没有两个相同的 case 常量。当然,外部 switch 语句中的 case 常量可以和内部 switch 语句中的 case 常量相同。
  • switch 语句通常比一系列嵌套 if 语句更有效。


最后一点尤其有趣,因为它使我们知道 Java 编译器如何工作。当编译一个 switch 语句时,Java 编译器将检查每个 case 常量并且创造一个“跳转表”,这个表将用来在表达式值的基础上选择执行路径。因此,如果你需要在一组值中做出选择,switch 语句将比与之等效的 if-else 语句快得多。

编译器可以这样做是因为它知道 case 常量都是同类型的,所要做的只是将它与 switch 表达式相比较看是否相等。对于一系列的 if 表达式,编译器就无此功能。



版权声明:本文为Dagssb原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。