Java的流程控制语句中的分支语句有单分支 if ,双分支 if ... else ,多分支 if ... else if .. else,除此之外还有switch语句,其中多分支的情况既可以用if ... else if ...else 还可以用switch来写,基本都能得到想要的结果。
if 与 if else
在有两个分支的情况下时,常常可以用if和if else(多分支时也可以用单if),但if和if else在两分支情况下是有区别的:单if写两次意味着两次都会进入if的条件判断语句去进行判断 ,而if else若进入if条件判断时满足执行,那么不会再进入else条件判断中。单if代码举例:
int num = 50;
if(num > 40) {
System.out.println("num大于40");
}
if(num < 60) {
System.out.println("num小于60");
}
该代码的运行结果如下:
if else if else代码举例:
int num = 50;
if(num > 40) {
System.out.println("num大于40"); //执行完这句就结束,不会进入else
} else if(num < 60) {
System.out.println("测试代码1");
} else {
System.out.println("测试代码2");
}
运行结果如下,在判断满足任何一个条件以后就会终止接下来的判断,所以只会输出一句:
多分支情况下的if... else if... else同理,都是只会进入其中一条语句执行且终止后续判断,相比只用单if语句来得效率更高,单if语句更常用于拦截或者穷举情况。
switch语句
switch语句也可以用来实现类似的条件分支效果,switch的语法格式如下:
switch (表达式) {
case 常量1:
语句;
break;
case 常量2:
语句;
break;
......
default:
break;
}
switch语句中可以匹配的表达式的类型有
byte、short、char、int这四种类型;
枚举类型;
String 类型;(1.7以后开始支持)
switch语句的规则很简单,即拿switch后的表达式的值和case后的值做判断,满足哪个就进入哪个case去执行语句。不过需要注意的是,case之后的值必须和switch变量的类型一致。
此外,switch语句一般都会在最后加上default进行结束,表示如果没有case的值可以匹配上那么最后会执行这条语句。
switch语句只有在匹配上相应的case的值才会进入该case执行语句,若该case在语句最后有break;那么执行完该语句会退出switch,如果该case没有break;那么会直接匹配接下来的case并执行语句(无论是否匹配),直到遇到break;或者default。(case穿透现象)
有break的代码和运行结果举例:
Scanner sc = new Scanner(System.in);
System.out.println("请输入天:");
int day = sc.nextInt();
switch(day) {
case 1:
System.out.println("星期一");//有break的情况下
break;
case 2:
System.out.println("星期二");
break;
case 3:
System.out.println("星期三");
break;
}
而在没有break的情况下,会出现case穿透现象,代码和运行结果如下:
Scanner sc = new Scanner(System.in);
System.out.println("请输入天:");
int day = sc.nextInt();
switch(day) {
case 1:
System.out.println("星期一");
//没有break
case 2:
System.out.println("星期二");
//没有break
case 3:
System.out.println("星期三");
break;
}
使用差异和运行效率
对于多分支情况来说,使用if else if 和 switch通常都可以,但是由于switch的变量类型限制,使用场景相对于if else if来说肯定局限很多,比如switch就无法匹配逻辑判断表达式如 if(a > b && a > c),只能匹配常量。
如果条件分支比较多的情况下,使用switch语句效率会更高,因为switch case语句会生成一个跳转表来指向case分支的地址,而这个表的索引号与switch变量的值是相等的。因此不需要像if else一样一个个遍历去判断,而是直接访问对应索引号,所以效率自然会更高。