黑马程序员技术交流社区

标题: if else 为什么没有switch好? [打印本页]

作者: Sunflower丶    时间: 2014-8-10 20:53
标题: if else 为什么没有switch好?
求解答?
作者: 怀念黑海岸    时间: 2014-8-10 20:58
  因为对于if判断条件来说,他会被虚拟机寄存器多次读取到,因为你如果第一个if不匹配的话还要进行后面的if判断,那么寄存器就会多次重复的读取这个变量,多次的读取肯定没有switch语句这样子的一锤子买卖来的更直接。一般我们衡量一段代码的好坏时主要评价标准就是代码的运行效率,前者明显没后者高效,所以才有你的这种说法吧。。
作者: 马静    时间: 2014-8-10 21:01
不是绝对的吧,好吧我只是个新人
作者: 亨利大帝    时间: 2014-8-10 21:01
2楼说的很清楚了
作者: icris    时间: 2014-8-10 21:08
先问是不是,再问为什么。
当然不是,switch 能做的 if 都能做,switch 不能做的 if 也能做,而 switch 不能做的太多了。在 switch 能用的情况里(由于情况太少所以一看就知道能用),也不会故意不用它,根本没有比较的必要吧
作者: 好男人进化论    时间: 2014-8-10 21:23
我觉得if else蛮好的啊,视频讲解里面,也是推荐我们一般情况下使用if else
作者: 酋长第一    时间: 2014-8-10 21:48
switch 用于有明确选项的,比如输入数字 判断 星期,月,季节,年
if()用于某种特定范围   比如表达式,数字范围

看需求,没有绝对的  

作者: sunny~    时间: 2014-8-10 21:56
各有各的好处
作者: 复仇者联盟    时间: 2014-8-10 22:35
应该是具体情况具体分析的,什么事情都没有绝对的。
作者: wawsc5354524    时间: 2014-8-11 01:03
两种不同的条件下使用吧,switch 一般用在条件已知,且准确的环境下
作者: 范靖明    时间: 2014-8-11 02:02
要看你从哪方面说了?是效率还是循环的复杂程度!
作者: 草鱼狂飙    时间: 2014-8-11 07:48
switch...case与if...else的根本区别在于,switch...case会生成一个跳转表来指示实际的case分支的地址,而这个跳转表的索引号与switch变量的值是相等的。从而,switch...case不用像if...else那样遍历条件分支直到命中条件,而只需访问对应索引号的表项从而到达定位分支的目的。
具体地说,switch...case会生成一份大小(表项数)为最大case常量+1的跳表,程序首先判断switch变量是否大于最大case 常量,若大于,则跳到default分支处理;否则取得索引号为switch变量大小的跳表项的地址(即跳表的起始地址+表项大小*索引号),程序接着跳到此地址执行,到此完成了分支的跳转。

switch有点以空间换时间的意思,而事实上也的确如此。
1.当分支较多时,当时用switch的效率是很高的。因为switch是随机访问的,就是确定了选择值之后直接跳转到那个特定的分支,但是if。。else是遍历所以得可能值,知道找到符合条件的分支。如此看来,switch的效率确实比ifelse要高的多。
2.switch...case占用较多的代码空间,因为它要生成跳表,特别是当case常量分布范围很大但实际有效值又比较少的情况,switch...case的空间利用率将变得很低。
3.switch...case只能处理case为常量的情况,对非常量的情况是无能为力的。例如 if (a > 1 && a < 100),是无法使用switch...case来处理的。所以,switch只能是在常量选择分支时比ifelse效率高,但是ifelse能应用于更多的场合,ifelse比较灵活。
作者: Joemi    时间: 2014-8-11 07:51
我还是第一次知道switch效率高,以前都不关注这个
作者: 晓风    时间: 2014-8-11 08:51
二楼和12楼说的很清楚。
作者: 廿乙木    时间: 2014-8-11 09:11
if else 结构没有switch 清晰,其次。if else 会消耗更多资源
作者: icris    时间: 2014-8-11 09:17
算了,放个链接
http://fishermen.iteye.com/blog/430286
已做试验,30个条件循环100000000次,
if consume time:4,switch consume time:57

<q>talk is cheap, show me the code.</q>




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