黑马程序员技术交流社区

标题: 关于switch语句高效性问题 [打印本页]

作者: 胡滨    时间: 2013-4-11 07:59
标题: 关于switch语句高效性问题
本帖最后由 胡滨 于 2013-4-11 13:04 编辑

书上说:switch语句比if语句提供一个更高效的实现。

但木有例子体现一下啊,倒是感觉它更麻烦{:2_31:}

哪位大仙给个好例子(体现switch比if高效的),还望不吝赐教


作者: 王怀亮    时间: 2013-4-11 08:39
我们来比较一下if和switch语句:
if语句是大家可能接触的最早,也是最先掌握的流程控制语句,因为它比较符合我们的顺势思维逻辑: 举一个很简单的例子:
  1. if(A>B)
  2. {A=B;}
  3. else
  4. {B=A; }
复制代码
这是一个很简单的,也是很经典的if语句,如果将这个例子放在switch 语句中,也并不是不能实现,但是实现起来可能会比较麻烦一些,因为在switch语句中case中要求的是常量,一般是不能进行逻辑判断的, 所以这也是if语句优于switch语句的地方!但是如果您判断的都是几个常量的数据,这时候switch就发挥作用了,比如下面的switch代码:
  1. switch(A)
  2. {
  3.    case:xxxx
  4.      ///程序代码
  5.      break;
  6.     case:xxxxxx
  7.     ///程序代码
  8.     break;
  9. }
复制代码
这样的语句,虽然if语句也是能实现的,但是性能就比switch差的有点远了,因为switch语句是直接定位的,就像数据库架构大量数据时用到的索引一样,如果用if,需要一个else if一个else if的找,但是用switch可以直接定位,特别是判断的变量时字符串时,那比较的速度就快很多了你可以自己写两个判断的代码,分别在if中和switch中把最后执行的那部分放在最后,然后看看两种判断执行的时间
作者: HM邱刚权    时间: 2013-4-11 08:53
本帖最后由 HM邱刚权 于 2013-4-11 08:55 编辑

if
语句处理两个分支,处理多个分支时需使用
if-else-if结构,但如果分支较多,则嵌套的if
语句层就越多程序不但庞大而且理解也比较困难
switch语句:
判断结构在判断复杂条件时,优势更明显,而且有些复杂结构无法用第一种结构来判断。比如说,我去超市购物了,看到好多东西要买,就买了一些东西回来。如何使用Switch Case来判断我买了什么呢?看Example:
Switch (true)
   Case apple>0
   Console.write(“我买苹果啦!”);
  Case banana>0
   Console.write(“我买香蕉啦!”);
  Case orange>0
   Console.write(“我买橘子啦!”);
  Case else
   Console.write(“忘了带钱了,回家拿钱去吧!”);
}

作者: 王永彬    时间: 2013-4-11 08:58
此外java7还增强了switch语句的功能,允许switch语句的控制表达式是java.lang.String类型的变量或表达式(只能是java.lang.String)类型,不能是Stringbuffer或StringBuilder这两种字符串类型。

捕获.PNG (36.86 KB, 下载次数: 19)

捕获.PNG

作者: 小菜凉碟    时间: 2013-4-11 09:39

  1. <P> 当对某几个值进行判断的时候,可以使用if语句,或者switch语句。建议使用switch。但是,使用switch要注意,它只能操作四种类型的值,byte,short,int,charr如果是四种以外的值,需要使用if。
  2. 如果需要选择的对象是区间,则用if语句;
  3. 具体值用switch和if均可,如下面的输入一个月份,判断哪个季节,因为每3个月对应一个季节,这三个月可以只写一个break,这样会少写几行代码,提高效率
  4. 若要用if语句,本题代码则比较繁琐
  5. </P>
复制代码
  1. int month = 8;
  2. switch (month){
  3. case 3:
  4. case 4:
  5. case 5:
  6. System.out.println(month+"月是春季");
  7. break;
  8. case 6:
  9. case 7:
  10. case 8:
  11. System.out.println(month+"月是夏季");
  12. break;
  13. case 9:
  14. case 10:
  15. case 11:
  16. System.out.println(month+"月是秋季");
  17. break;
  18. case 12:
  19. case 1:
  20. case 2:
  21. System.out.println(month+"月是冬季");
  22. break;
  23. default:
  24. System.out.println(month+"月没有这样的月份")

  25. }//上述例子就是三个case里面的值输出都一样的,所以我们省略了break;这样会少写几行代码,提高效率
复制代码

作者: 李大伟    时间: 2013-4-11 09:52
if 语句适用范围比较广,只要是 boolean 表达式都可以用 if 判断;而 switch 只能对基本类型进行数值比较。
if 语句每一句都是独立的,看下面的语句:
if (a == 1) ...
else if (a == 2) ...
这样 a 要被读入寄存器两次,1 和 2 分别被读入寄存器一次。其实 a 读两次是有点多余的,在你全部比较完之前只需要一次读入寄存器就行了,其余都是额外开销。但是 if 语句必须每次都把里面的两个数从内存拿出来读到寄存器,它不知道你其实比较的是同一个 a。
于是 switch case 就出来了,把上面的改成 switch case 版本:
switch (a) {
        case 0:
                break;
        case 1:
}
因为特定的规则,他一开始就知道你要比 a,于是 a 一次性读取,相比 if 节约了很多开销。
这个在张老师的视频里提到过,

作者: 刘林虎    时间: 2013-4-11 12:04
如果纯粹比较数字或字符,建议使用switch,因为它只会在一开始的switch括号中取出变量值一次,然后将这个值与下面所设定的case比较,但如果使用if,每次遇到条件式时,都要取出变量值,效率的差异就在这儿。例如:

if(a == 1)
    //...
else if(a == 2)
    //...
else if(a == 3)
    //...

这个程序片段在最差的状况下,也就是a = 3时,共需3次比较,而每次比较都必须取出变量a的值一次。如果换成switch:

switch(a)
{
    case 1:
        //...
        break;
    case 2:
        //...
        break;
    case 3:
        //...
        break;
}

在这个程序片段中,只在开头switch的括号中取出变量a的值,然后逐一比较下面的case,效率的差别就在这儿。当然并不是使用if就不好,遇到复合条件时,switch就帮不上忙了,由于无法在switch中组合复杂的条件语句,这时就得使用if了。简单地说,if与switch两者可以搭配着灵活使用。

作者: 胡滨    时间: 2013-4-11 13:04
已解决  :handshake

非常感谢这么多热心高手们。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2