参考博客:

https://www.cnblogs.com/balingybj/p/5751707.html

 Switch的思考

Switch与If--else的比较

switch...case与if...else的根本区别在于,

switch...case会生成一个跳转表来指示实际的case分支的地址而这个跳转表的索引号与switch变量的值是相等的。从而,switch...case不用像if...else那样遍历条件分支直到命中条件,而只需访问对应索引号的表项从而到达定位分支的目的

具体地说:

  • switch...case会生成一份大小(表项数)为最大case常量+1的跳表,
  • 程序首先判断switch变量是否大于最大case 常量,若大于,则跳到default分支处理;
  • 否则取得索引号为switch变量大小的跳表项的地址(即跳表的起始地址+表项大小*索引号)(类似与ArrayList实现了RandomAccess随机访问接口)
  • 程序接着跳到此地址执行,到此完成了分支的跳转。

由此看来,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比较灵活。

JDK1.5 switch中枚举(Enum)的使用

JDK1.5 之前,switch语句支持的数据类型有byte、short、int、char.

在JDK1.5之后,增加了枚举类型,枚举类型可以对状态常量进行统一的整理,并且添加基本属性。 

枚举也可以更在Sewitch后面,原因是switch先计算变量的排序值,然后与枚举常量的每个排序值进行对比,当变量为空时,调用ordinal方法报空指针异常。所以对于安全性要求高的代码需要判断

switch(s) =s.ordinal;

jdk1.7 Switch中Spring的使用

在Java 7中,增加了对String类型的支持:实现的机制是根据字符串的哈希值匹配。下图是原文件编译前,和编译后,

Java和class文件的对比。

可以看出将字符串的switch转换为两个switch处理,通过哈希值匹配到数据,通过定义的byte变量在swit到具体的代码快执行。

switch的一些思考(seitch与ifelse的区别)的更多相关文章

  1. 操作循环的关键字switch,break,return的应用及区别

    break 使用break结束循环  break可以终止循环 和 switch语句的运行; break用于结束一个循环,即跳出循环体,执行循环体之后的代码: switch 使用continue提前结束 ...

  2. switch 和 if else if else 有什么区别

    1.  一般情况下,它们两个语句可以相互替换 2.  switch..case语句通常处理case为比较确定值的情况,而if...else...语句更加灵活,常用于范围判断(大于.等于某个范围) 3. ...

  3. 多个if和一个ifelse的区别

    一个程序的要求如下,输入一个学生的数学成绩,如果大于等于60,那么就输出good,如果小于60那么输出not good int a scanf_s("%d",&a) if( ...

  4. 005-循环结构(上)-C语言笔记

    005-循环结构(上)-C语言笔记 学习目标 1.[掌握]switch-case结构 2.[理解]case语句穿透 3.[理解]Xcode断点调试 4.[理解]while循环结构初体验 5.[掌握]w ...

  5. 不吹牛X,我真的干掉了if-else

    我们在web开发中,经常使用数据库表中的字段作为"标记"来表示多个"状态",比如: 我们就以某宝的在线购物流程为例进行分析.在订单表中,使用zt字段来表示定单的 ...

  6. 转!论if else与switch的效率高低问题

    转 下面来详细描述switch与ifelse的区别. switch...case与if...else的根本区别在于,switch...case会生成一个跳转表来指示实际的case分支的地址,而这个跳转 ...

  7. 选择结构的三角关系Switch、Case、Default!!!

    选择结构的三角关系Switch.Case.Default!!! 今天我们学习选择结构进化章节——Switch结构,他与if有什么区别呢? 相同点: 都是用来处理多分支条件的结构 不同点: switch ...

  8. Golang教程:switch 语句

    switch 是一个条件语句,用于将一个表达式的求值结果与可能的值的列表进行匹配,并根据匹配结果执行相应的代码.可以认为 switch 语句是编写多个 if-else 子句的替代方式. 举例是说明问题 ...

  9. java中的switch结构

     switchkeyword的中文意思是开关.转换的意思,switch语句在条件语句中特别适合做一组变量相等的推断,在结构上比if语句要清晰非常多.switch语句的语法格式为:switch(表达式) ...

随机推荐

  1. vs 打开项目,发现项目中通过nuget引用的dll都不可用的解决方法

    把项目文件夹下的package文件删除,再重新生成项目,就会自动从nuget上下载了.

  2. 命令 关闭SElinux

    # sed -i 's/^SELINUX=.*$/SELINUX=disabled/g' /etc/selinux/config

  3. YOLO-V3实战(darknet)

    一. 准备工作 1)实验环境: darknet 是由 C 和 CUDA 开发的,不需要配置其他深度学习的框架(如,tensorflow.caffe 等),支持 CPU 和 GPU 运算,而且安装过程非 ...

  4. C++栈(stack)、队列(queue)、链表(list)的常用函数

    C++队列Queue是一种容器适配器,它给予程序员一种先进先出(FIFO)的数据结构.1.back() 返回一个引用,指向最后一个元素2.empty() 如果队列空则返回真3.front() 返回第一 ...

  5. SCOI 2016 萌萌哒

    SCOI 2016 萌萌哒 solution 有点线段树的味道,但是并不是用线段树来做,而是用到另外一个区间修改和查询的利器--ST表 我们可以将一个点拆成\(logN\)个点,分别代表从点\(i\) ...

  6. 数据可视化之powerBI基础(五)深入了解Power BI的跨页钻取交互

    https://zhuanlan.zhihu.com/p/79036123 在 PowerBI 中还有一种有趣的交互方式:跨页钻取.它可以通过点击某个数据点,钻取到另一个页面,进一步展示该数据点的详细 ...

  7. POJ 1063 Flip and Shift 最详细的解题报告

    题目来源:Flip and Shift 题目大意:一个椭圆形的环形容器中有黑色和白色两种盘子,问你是否可以将黑色的盘子连续的放在一起.你可以有以下两种操作: 1.顺时针旋转所有的盘子 2.顺时针旋转3 ...

  8. day7 python字符串的操作及方法

    1.字符串 1.1 字符串的操作 # 1.字符串的拼接 strvar = "我爱" + "中国" # 2.字符串的重复 strvar = "今天下午2 ...

  9. Go Pentester - HTTP Servers(1)

    HTTP Server Basics Use net/http package and useful third-party packages by building simple servers. ...

  10. Burp Suite Compare Module - 对比模块

    虚拟目标网站: http://10.0.0.15/orangehrm/login.php (RangeHRM)    -  可以通过OWASP虚拟机搭建此网站 模拟攻击步骤: 1. 通过设置浏览器代理 ...