A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 龚建锋 初级黑马   /  2012-7-7 22:19  /  2785 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

if 和 switch语句在编程中如何能确定使用哪个能确保代码的高效率?

9 个回复

正序浏览
如果有连着的5个if else if else if else if else 那么阅读性就...这时如能用switch至少阅读性好吧。至于用哪个,视情况而定吧,switch语句有一定局限性吧。
回复 使用道具 举报
  switch语句与if语句不同之处在于: switch语句仅能测试相等的情况,而if语句能够计算任何类型的布尔表达式,也就是switch语句仅查找表达式值与某个case常量是否匹配.而if-else是判断条件语句为真还是假。

  当编译器编译switch语句时,Java编译器检查每个case常量并创建一个”跳转表”,该表用于在表达式值的基础上选择执行路径,因此,如果在很多值中进行选择, switch语句将比使用一系列if-else-if语句的等效逻辑代码运行速度快,并且结构清晰。因为编译器知道case常量都是同一类型的,所以要做的只是将它与switch表达式相比较,而对于一系列if表达式,编译器就无此功能.

在实际的代码中,可以根据需要来使用对应的语句实现程序要求的逻辑功能。
回复 使用道具 举报
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:
}
所以switch 语句要更高效
回复 使用道具 举报
switch与if的区别   

如果纯粹比较数字或字符,建议使用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两者可以搭配着灵活使用。
回复 使用道具 举报
if 和switch 语句很像.
具体什么场景下,应用哪个语句呢?
如果判断的具体数值不多,而是符号byte,short int char 四种类型.
虽然2个语句都可以使用,建议使用switch语句.因为效率稍高.
其他情况:对区间判断,对结果为boolean 类型判断,使用if if的使用范围更广。
if 除了能判断具体数值还能判断区间。switch 判断区间会很费劲的。要写好多case 对于运算结果是boolean型的 if 能判断 switch 是不能实现的。
实际开发怎么选择呢。
    如果要对具体数值进行判断,并且数值不多,那么 就用switch 来完成。 Switch 是一开始就全部加载进了内存,而if 语句要顺序执行,需要多个if 和else if 执行过程就要比switch 稍微多了一点。
但是switch 的局限性比较大必须是4种类型,并且值不多。一般都是使用if 最后在jdk 7中对switch 进行了增强 还可以判断字符串。5.0 增加了对枚举的判断。
   这是我总结的一点体会,希望对你有帮助。
回复 使用道具 举报
如果你有两个以上基于同一个数字型变量的条件表达式,那么最好使用一条switch语句。

例如,与其使用下述代码:
if (x ==l)
      printf ("x is equal to one. \n");
else if (x ==2)
      printf ("x is equal to two. \n");
else if (x = =3)
      printf ("x is equal to three. \n");
else
      printf ("x is not equal to one, two, or three. \n");
不如使用下述代码,它更易于阅读和维护:
switch (x)
{
      case 1:  printf ("x is equal to one. \n");
                       break;
      case 2:  printf ("x is equal to two. \n");
                       break
      case 3:  printf ('x is equal to three. \n");
                       break;
      default: printf ("x is not equal to one, two, or three. \n");
                       break;
}

注意:使用switch语句的前提是条件表达式必须基于同一个数字型变量。例如,尽管下述if语句包含两个以上的条件,但该例不能使用switch语句,因为该例基于字符串比较,而不是数字比较:
    char *name="Lupto";
     if(!stricmp(name,"Isaac"))   
         printf("Your name means'Laughter'.\n");
     else if(!stricmp(name,"Amy"))
         printf("Your name means'Beloved'.\n");
     else if(!stricmp(name,"Lloyd"))
         printf("Your name means'Mysterious'.\n");
     else
         printf("I haven't a clue as to what your name means.\n");
希望能帮到你。

回复 使用道具 举报
我补充两句:
1.如果判断的具体数值不多,而是符合byte,short,int,char这四种类型。虽然这两个语句都可以使用,建议使用switch语句。因为效率稍高。
2.其他情况:对区间判断,对结果boolean类型判断,使用if,if的适用范围更广。
回复 使用道具 举报
switch叫多分支选择语句,相当于if() {}  else if() {}  else if() {} else {},switch语句效率要高,但使用范围小。
回复 使用道具 举报
使用if的情况:
        1.对具体的值进行判断
        2.对区间判断
        3.对运算结果是boolean类型的表达式进行判断

使用switch的情况:
        1.对具体的值进行判断
        2.值的个数通常是固定的
        对于几个固定的值判断,建议使用switch语句。因为switch语句会将具体的答案都加载进内存,效率相对高。

这是我看毕老师的视频做的笔记,你可以参考一下。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 总结的很清晰,赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马