浅谈switch中default的“回头”原理

笔者学学java已经历经两年,平常能用IF就绝不用switch,故实在生疏

如今大二暑假,准备实习面试,所以仔细探究了一下switch的用法,看了诸多文章,实在是觉得switch运行有些混乱,大概这也是很少被人使用的原因吧

在我的印象中,JVM虚拟机是解释器+编译器,所以大多数情况应当是尽量按照顺序从上至下执行,但是有一种情况是是:当没有执行任何一个case时,就会从default开始穿透执行(笔者戏称为“回头”行为)

(这里的目标是6,不会执行任何case)

第二种情况是,当执行了任何一个case时,default就是个正常的“case”,也会被穿透

如果要细分,default在目标前,目标后,没有找到目标,等等多种情况,都是令人头大的问题

所以我便粗浅的研究switch的运行原理,利用IDEA的插件jclasslib探究虚拟机的执行顺序

这一段代码,目标case是2,因此可以寻找的到,执行顺序便是2、3、1都可以理解

 

这就是上述代码的字节码表,虚拟机的执行顺序

 

可以虚拟机遇到switch循环体的时候,就建立了一张tableswitch表,将下面所有的case进行了有小到大的排序(default的也被安排在第四的位置),如此一来,虚拟机只需要拿着目标,一个个按顺序比对,找到相应的case就可以了

上述目标是2,所以在tableswitch表中找到了2:  52(+49)该串,然后虚拟机直接插入第52行,得到数字2,55行执行目标代码,接着就是按照顺序解释执行了

而之所以有default的“回头”现象,是因为36-76行的顺序依旧是原代码,所以执行引擎若是没有找到目标case,在表中就会执行最后一行的default,然后带着原代码位置的信息,直接插入,形成一个“穿透”现象

这就是没有找到目标case,而执行default“回头”并且穿透现象的情况

 

上述代码的字节码执行顺序,可以看出,虚拟机执行了最后一行default,带着位置信息第48行,依次向下执行48-80行全部执行,而40-48并没有执行

 

总结来看,tableswitch有些像是预编译好了,个人觉得体现了解释器+编译器同时进行的java虚拟机特色,所以遇到switch 的时候,不妨自己脑海中建立一tableswitch表,这样子就不怕记忆混乱导致编写错误了。用原理来替代死记,这就是虚拟机的魅力啊

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值