switch-case与ifelse的区别和联系以及效率
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为什么具有直通性?
switch case判断字符串⽤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),显得更为灵活。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论