专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

switch的一些思考(seitch与ifelse的区别)

参考博客:

https://tech.souyunku.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;

25_1.png

jdk1.7 Switch中Spring的使用

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

Java和class文件的对比。

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

25_2.png

文章永久链接:https://tech.souyunku.com/30562

未经允许不得转载:搜云库技术团队 » switch的一些思考(seitch与ifelse的区别)

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们