从结构上分析Java中的 if/else与switch的区别

听同事说了一句能用if/else就别用switch,感觉这就话不对,但是又提不出什么依据进行判断,不能明白其中是不是有什么深层次的原因,今天就探究一下这方面的原因。我们要明白我们的程序到底是谁帮助我们做的?

我们首先得明白计算机的五大组成部分控制器,运算器,存储器,输入,输出。我们的程序调度其实是运算器在帮助我们进行做的,我们的Java代码其实到最后真正执行的就是一串串指令,而其中在其中有一些不同特殊的指令,今天我们要说的就是跳转指令,其中跳转指令又分为有条件条件转,与无条件跳转。

所谓的跳转指令在我们的Java语言体系中也就是我们今天要说的if else,但是switch则不一样,switch的具体实现根据不同系统的实现有关,如果分支比较少的话会转换为跳转指令,但是如果是分支比较多的话则会转换为跳转表的方式。

在判断比较多的时候,如果还是跳转指令会进行很多次的比较运算,因为我们指令在执行的时候回从寄存器里面来回的进行取值压值,这样其实是比较浪费时间的,这个时候会转换为另一种更为高效的方式,称之为跳转表,跳转表其实是一个映射表存贮的是值与代码块的位置。

话又说过来了,为什么跳转表就是很快了,因为其中的值必须是整数值,并且是按照大小顺序进行排序,使用高效的二分查找法,没查找一次就省略一半的时间。如果值是连续的,switch还会转换为数组,这下连找就不用找了,直接定位到位置,就算不是连续的,如果是密集的数值的话,也是会转换为一个数组类型的跳转表。

另外在我们的源代码中的值判断是不会进行排序的,我们考虑过是什么时候进行排序呢?是在运行的时候Java虚拟机帮我们做这件事,还是在编译的时候呢,因为这本来就是静态的资源,是可以在编译的时候进行确认的。另外 bate/char/int ,short,枚举都能使用,string也能行,但是long不行,因为跳转表的一片区域的空间一半是32位,而long64,放不下喽。而到了String这个怎么排序呢,我们大家知道就算相同的字符串其实他的hashCode的值是可能冲突的这个时候h会拉出一个链表对他再次进行判断。

另外虽然经过最近几个版本的扩展中,switch可以使用枚举,String,其实在底层,还是只支持四种类型。只不过在编译的时候对新增的几种类型做了处理,处理成了四种类型。

针对于包装类型,switch则是对其经过了拆箱的的过程进行处理。

if与else与switch中的区别就是我们撸码中比较常见的与空间换时间,时间换空间的最经典的例子,在我们开发中当你发现你的代码无懈可击的时候,恰恰是最不适合的,我们没有最优的技术 只有最合适自己的技术。

另外如果我们的代码中如果存在了过多的if判断,会影响我们代码的可读性,另外过多的if中你也从另一个方面证明了,你的设计可能是有问题呢。可以选用策略模式,职责链模式,代理模式都可以解决这些问题。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值