swhich case 和 if else 的效率问题
2015-08-03 18:11
106 查看
先聊一下switch与ifelse的区别。
switch...case与if...else的根本区别在于,switch...case会生成一个跳转表来指示实际的case分支的地址,而这个跳转表的索引号与switch变量的值是相等的。从而,switch...case不用像if...else那样遍历条件分支直到命中条件,而只需访问对应索引号的表项从而到达定位分支的目的。
具体地说,switch...case会生成一份大小为最大case常量+1的跳转表,程序首先判断switch变量是否大于最大case 常量,若大于,则跳到default分支处理;否则取得索引号为switch变量大小的跳表项的地址(即跳表的起始地址+表项大小*索引号),程序接着跳到此地址执行,到此完成了分支的跳转。
由于switch 要建立跳转表 所以需要耗费空间,这就有点以空间换时间的意思了。
首先.当分支较多时,当时用switch的效率是很高的。因为switch是随机访问的,就是确定了选择值之后直接跳转到那个特定的分支,但是if。。else是遍历所以得可能值,知道找到符合条件的分支。如此看来,switch的效率确实比ifelse要高的多。
switch...case占用较多的代码空间,因为它要生成跳表,特别是当case常量分布范围很大但实际有效值又比较少的情况,switch...case的空间利用率将变得很低。
switch...case只能处理case为常量的情况,对非常量的情况是无能为力的。例如 if (a > 1 && a < 100),是无法使用switch...case来处理的。所以,switch只能是在常量选择分支时比ifelse效率高,但是ifelse能应用于更多的场合,ifelse比较灵活。
但是 switch case 语句比较有局限性,因为他会受限于表达式类型。
switch 表达式类型: 在java 1.6 及以前版本 表达式类型只能是:byte shot char int Enum 在 java 1.7 及以后String 也可以。
switch...case与if...else的根本区别在于,switch...case会生成一个跳转表来指示实际的case分支的地址,而这个跳转表的索引号与switch变量的值是相等的。从而,switch...case不用像if...else那样遍历条件分支直到命中条件,而只需访问对应索引号的表项从而到达定位分支的目的。
具体地说,switch...case会生成一份大小为最大case常量+1的跳转表,程序首先判断switch变量是否大于最大case 常量,若大于,则跳到default分支处理;否则取得索引号为switch变量大小的跳表项的地址(即跳表的起始地址+表项大小*索引号),程序接着跳到此地址执行,到此完成了分支的跳转。
由于switch 要建立跳转表 所以需要耗费空间,这就有点以空间换时间的意思了。
首先.当分支较多时,当时用switch的效率是很高的。因为switch是随机访问的,就是确定了选择值之后直接跳转到那个特定的分支,但是if。。else是遍历所以得可能值,知道找到符合条件的分支。如此看来,switch的效率确实比ifelse要高的多。
switch...case占用较多的代码空间,因为它要生成跳表,特别是当case常量分布范围很大但实际有效值又比较少的情况,switch...case的空间利用率将变得很低。
switch...case只能处理case为常量的情况,对非常量的情况是无能为力的。例如 if (a > 1 && a < 100),是无法使用switch...case来处理的。所以,switch只能是在常量选择分支时比ifelse效率高,但是ifelse能应用于更多的场合,ifelse比较灵活。
但是 switch case 语句比较有局限性,因为他会受限于表达式类型。
switch 表达式类型: 在java 1.6 及以前版本 表达式类型只能是:byte shot char int Enum 在 java 1.7 及以后String 也可以。
相关文章推荐
- Codeb::Blocks
- UI中的协议使用步骤
- 理解z-index
- centOS目录结构详细版
- HDU 4312 最小切比雪夫距离-转化成曼哈顿距离再分治
- SVN 权限配置详细说明
- linux修改文件夹及文件权限的命令
- poj 1167 The Buses
- windows10正式版下载安装并激活附最新下载地址
- GDI绘图1——调试
- String StringBuffer StringBuilder比较
- Android复习笔记(4) - 文件读取相关
- lintcode Binary Search
- 简单堆栈类
- Java垃圾回收机制
- 用instancetype代替id作返回类型有什么好处?
- phpcms V9二次开发之联动菜单筛选 包括box字段的多选 单选 筛选教程
- cloudfs4oss配置
- xampp出现 Access forbidden! 问题解决
- [经验]我的电脑只有IE64位浏览器能上网,其他软件都上不了网