switch-case与if else的区别和联系以及效率

1.1 .switch case与if else的区别:

switch case会生成一个跳转表来指示实际的case分支的地址,而if…else却需要遍历条件分支直到命中条件,

1.2. switch case的优缺点

(1)switch case的优点:

当分支较多时,用switch的效率是很高的。因为switch是确定了选择值之后直接跳转到那个特定的分支.

(2)switch case的缺点:

  1. switch…case占用较多的代码空间,因为它要生成跳表,特别是当case常量分布范围很大但实际有效值又比较少的情况,switch…case的空间利用率将变得很低。

  2. switch…case只能处理case为常量的情况。
    基本数据类型:byte, short, char, int
    包装数据类型:Byte, Short, Character, Integer
    枚举类型:Enum
    字符串类型:String(Jdk 7+ 开始支持)

1.3. if else的优缺点

(1)if else的优点:if else能应用于更多的场所以if else比较灵活。

(2)if else的缺点:if else必须遍历所以得可能值。

总结:

  1. 在选择分支较多时,选用switch…case结构会提高程序的效率,但switch不足的地方在于只能处理字符或者数字类型的变量,if…else结构更加灵活一些,if…else结构可以用于判断表达式是否成立,比如if(a+b>c),if…else的应用范围更广,switch…case结构在某些情况下可以替代if…else结构。

  2. switch不加break为什么具有直通性?
    用break的作用就是跳出switch,不执行其他的case,如果不加就一直走下去,一直等到下一个break后跳出,如果一直没有break,就要等到switch结束后退出。

  3. 两者本质的区别是 if-else语句更适合于对区间(范围)的判断,而switch语句更适合于对离散值的判断

  4. 示例
    判断65分到85分之间的学生有哪些适合用if-else语句,因为[65,85]是区间
    而判断一个学生的班级是一班、二班还是三班适合用switch语句,因为一班、二班、三班是离散值

  5. 扩展
    所有的switch语句都可以用if-else语句来替换(因为if-else语句只需对每个离散值分别做判断即可),
    而并不是所有的if-else语句都可以用switch语句来替换(因为区间里值的个数是无限的并且switch所接受的值只能是整型或枚举型,
    所以不能用case来一一列举)。

  6. switch-case与if-elseif的根本区别在于汇编时,switch-case会生成一个跳转表来指示实际的case分支的地址,而这个跳转表的索引号与switch变量的值是相等的。从而,switch-case不用像if-elseif那样遍历条件分支直到命中条件,而只需访问对应索引号的表项从而到达定位分支的目的。
    具体地说,switch-case会生成一份表项数为case量+1的跳表,程序首先判断switch变量是否大于(小于)最大(最小)case 常量,若大于(小于),则跳到default分支处理;否则取得索引号为switch变量大小的跳表项的地址(即跳表的起始地址+表项大小*索引号),程序接着跳到此地址执行,到此完成了分支的跳转。

由此看来,switch-case结构有一点以空间换时间的意思,当分支较多的时候明显switch-case结构的实行效率会高很多。但是switch-case的缺点是只能处理常量的匹配,在仅有常量选择分支的时候,可以选用switch-case结构,而此时通过遍历数组比较更是不可取的一种方式,但是if-elseif可以应用于更多的场合(如a > 10 && a < 20),显得更为灵活。

你可能感兴趣的:(java基础)