java 中分支结构if和switch结构的区别

java 中分支结构if和switch结构的区别

If…else顺序判断条件分支,遇到表达式值为真时,执行代码,而switch…case生成一个跳转表来指示实际的case分支的地址,跳转表的索引号与switch变量的值相等,通过对应索引号的表项从而到达定位分支的目的。若switch变量为String类型,会有两个跳转表,先将String类型对应为一个int类型,再通过该int类型跳转到对应的分支。

switch是选择结构而if是多重选择结构
相同点:都可以判断多分支条件的结构
不同点:if选择结构 多用于范围性判断,没有switch选择结构条件的限制;switch选择结构,多用于判断等值判断
其中:
基本if选择结构: 处理单一或组合条件的情况
If-else选择结构:处理简单的条件分支情况
多重if选择结构:处理复杂的条件分支情况
嵌套if选择结构:用于较为复杂的流程控制

而switch选择结构
多重分支并且条件判断是等值判断的情况
处理系统异常(用户输入异常)

if和switch基本相同,但有一些差别:
(1)if的条件语句可以用表达式,switch则不行
(2)if 与else 或者 else if else 成对使用,也可单独使用,switch则与case搭配使用
(3)if条件不成立后才会去执行else中的语句,但是switch case语句中,如果case 语句中没有break,则会继续执行后面的语句

第三条是经常遇到的问题。

一、IF用法

if 主要有二种形式,if...then以及if...then..else形式。if只能对布尔值boolean进行判断,如下condition0、condition1和condition2必须为true或者false。

// if示例-1
boolean condition0 = false;
if (condition0) {
    //
}

// if示例-2
boolean condition1 = true;
if (condition1) {
    //
} else {
    //
}

// if示例-3
boolean condition2 = true;
if (condition0) {
    //
} else if (condition1) {
    //
} else if (condition2) {
    //
} else {
    
}

二、Switch用法

switch 有多个case块, 每个case后面的常量不能相同。

String expr = "1";
switch (expr) {
     case: "0":
          // 
         break;
     case "1":
          //A
          break;
     case "2":
          //B
          break;
      default:
         //C
}

三、if和switch的主要区别
(1)if的判断条件只能为布尔值,但是switch的expr可以为char, byte, short, int, Character, Byte, Short, Integer, String和enum枚举;
(2)if中的默认分支叫做else,就像上面的if-else if-else,switch的默认分支是一个default块;
(3)if的每个判断块只会有一个被执行,但是switch的一次判断中,可以有多个case被执行。比如上面的switch的例子中,如果在case块中没有break或者return,符合case=1后面的表达式的都会被执行,官方叫做_fall through_,从匹配的case后面每一个case块中顺序执行,即代码A->B->C处的代码都会被执行;
(4)if的判断分支可以多个为true,但是只有第一个if或者elseif会被执行,switch的case后面的常量不能相同,否则无法编译;
(5)switch后面的expr必须要和所有case后面的值一致,但是if判断的条件或表达式只能是布尔值。

可能说的不是很清楚,详细可以参考Java语言规范:


14.11. The switch Statement https://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.11