Java⼩⽩到底该如何使⽤switch和if...elseif?
Java⼩⽩到底该如何使⽤switch和if … else if?
最近看到⽹上有⼈在问:为什么⼤家都使⽤if ... else if,⽽很少使⽤switch?
这个问题如果是⼀般的程序员还真不知道为啥,只知道别⼈都是这样写的,所以跟着这样写了,很少有⼈会深⼊地去思考这个问题,如果你能有这个疑问,说明你有⼀颗求真的⼼(我当年也想过 )。
这个问题对编程没有⼀定功底,是答不出个所以然的。我认为主要可以从编码习惯和程序性能上去思考。
编码习惯
我⾸先来说⼀下编码习惯,其它的不说,单从代码⾏数来看的话,实现相同的逻辑,switch⽐if...else if占⽤的⾏数是要多⼀些的,请看下⾯的⽰例代码:
switch版
for(int i =0; i <10000000; i++){
b = i %10;
switch(b){
case1:
a = a +2;
break;
case2:
a = a +3;
break;
case3:
a = a +4;
break;
case4:
a = a +5;
break;
case5:
a = a +6;
break;
case6:
a = a +7;
break;
case7:
a = a +8;
break;
case8:
a = a +9;
break;
case9:
a = a +10;
break;
}
}
e = System.nanoTime();
小白学java有前途吗System.out.printf("运⾏时间:%.2f毫秒",(e - s)/1000000f); }
}
if … eles if 版
for(int i =0; i <10000000; i++){
b = i %10;
if(b ==1){
a = a +2;
}else if(b ==2){
a = a +3;
}else if(b ==3){
a = a +4;
}else if(b ==4){
a = a +5;
}else if(b ==5){
a = a +6;
}else if(b ==6){
a = a +7;
}else if(b ==7){
a = a +8;
}else if(b ==8){
a = a +9;
}else if(b ==9){
a = a +10;
}
}
e = System.nanoTime();
System.out.printf("运⾏时间:%.2f毫秒",(e - s)/1000000f);
}
}
上⾯两个⽰例类Demo1和Demo2实现的逻辑⼀模⼀样,Demo1使⽤switch实现,代码总⾏数是40⾏;⽽Demo2使⽤if ... else if实现,总共只有30⾏(这⾥显⽰不了⾏号,你可以把代码复制到⾃⼰的编辑器去看)。
单从这点来看,if ... else if就完胜了 ,毕竟程序员每多敲⼀个字母,对他⼿的伤害就会⼤⼀些,程序员的⼿还有其它很重要的⽤途的 !所以…新⼿程序员们要保护好⾃⼰的⼿哈。
说到新⼿,这⾥就不得不提使⽤switch的⼀个坑了,⼀般新⼿都会犯这样的错误,就是忘记写break、忘记写break、忘记写break,这个问题我见过90%的新⼿都会遇到,break不写编译不会报错,因为在语
法上来说,不写也是对的,只是写于不写,所表达的意思不⼀样。既然语法是对的,编译当然能通过。因为编译主要就是检测程序的语法是否合格,合格就将源码转换成机器可以执⾏的代码。所以这也是为什么不写break,还能编译通过的原因。
但程序在执⾏时,有break和没有break,结果会完全不⼀样,就拿上⾯Demo1的例⼦来说,少了⼀个break,变量a的结果都会有变化。所以,对于新⼿来说,switch中的break就是⼀个隐藏的,没⽤好就会产⽣bug。
但如果你的编程⽔平⾼,能彻底明⽩有break和没有break的区别,那在某些场景还是挺有⽤的,再来看下⾯的⽰例代码:
switch 版:
import java.util.Scanner;
public class Demo3 {
public static void main(String[] args){
System.out.print("请输⼊你的姓名:");
Scanner scanner =new Scanner(System.in);
String name = ();
switch(name){
case"张三":
case"李四":
System.out.println("欢迎你");
break;
case"王五":
System.out.println("对不起,这⾥不欢迎你");
break;
default:
System.out.println("你叫啥?");
break;
}
}
}
if … else if 版
import java.util.Scanner;
public class Demo4 {
public static void main(String[] args){
System.out.print("请输⼊你的姓名:");
Scanner scanner =new Scanner(System.in);
String name = ();
if("张三".equals(name)||"李四".equals(name)){
System.out.println("欢迎你");
}else if("王五".equals(name)){
System.out.println("对不起,这⾥不欢迎你");
}else{
System.out.println("你叫啥?");
}
}
}
这个⽰例的逻辑很简单,在控制台输⼊姓名,然后如果是张三或李四,就打印欢迎你,对王五打印不欢迎的内容。
这⾥如果仅从代码⾏数去看的话,还是使⽤if ... else if占优势,但从代码的可阅读性和可扩展性来说的话,明显使⽤switch更合适。
为什么这么说?举个栗⼦,业务上现在是要求对张三和李四说欢迎,如果隔壁的产品经理哪天想给你点事⼲,要求对赵⼀、赵⼆、赵三等等都说欢迎,那在Demo4⾥⾯得不断往if的条件后再追加条件;⽽在switch版本⾥⾯只需要追加⼀个case,⽽且看上去还⼀⽬了然,结构⾮常清晰,⽰例如下:
import java.util.Scanner;
public class Demo3 {
public static void main(String[] args){
System.out.print("请输⼊你的姓名:");
Scanner scanner =new Scanner(System.in);
String name = ();
switch(name){
case"赵⼀":// 追加的需求
case"张三":
case"李四":
System.out.println("欢迎你");
break;
case"王五":
System.out.println("对不起,这⾥不欢迎你");
break;
default:
System.out.println("你叫啥?");
break;
}
}
}
另外,在某些场景使⽤switch也会增加程序的复杂性和可读性。就拿上⾯的Demo1的代码来说,如果想要在switch的case 1⾥⾯跳出当前的for循环,那该怎样做呢?
public class Demo1 {
public static void main(String[] args){
long s = System.nanoTime(), e;
int a =0, b;
for(int i =0; i <10000000; i++){
b = i %10;
switch(b){
case1:
a = a +2;
// 在此次如何跳出for循环
break;
case2:
// 此处省略诺⼲⾏......
}
}
}
}
⼤家知道在for循环中要跳出当前的for循环,也是使⽤break关键字,但此处是在switch⾥⾯,switch⾥的break是退出当前的case。所以。。。 对于⼩⽩来说,这⾥就懵了!
真的,⼀般⼈还真不知道怎样处理这个问题,有⼈会想到⽴⼀个flag,在switch结束后去判断这个flag,或者直接判读i的值,⽐如下⾯这样:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论