if-else字节码文件
对应的代码
解释:
字节码文件中L0 对应的就是int a
的定义,LINENUMBER 14
对应的是代码中的14行
从L1开始 L2,L4,L5,L6,L7.L8,L9,L10,L1对应的就是if-esle里面的每一个分支
L3在最下面,对应的就是System.out.println(a)
其实通过观察if-else的分支对应的字节码文件,是可以发现:每一个分支,在判断完当前是否满足提交之后有两条路可以走,一条是GOTO L3
也就是直接通过GOTO
去输出结果,同时判断结束,如果不满足当前提交,那么他就会去下一个分支对应的判断,重复上述操作,这个其实就是"老实人",一步一个脚印的走,直到完成操作,所以在if-else的判断中,是建议把大概率满足的条件,放在靠前的位置。
switch对应的字节码
对应的代码
L0就不解释了,跟上面一样的
L1对应的就是switcw,观察可以看出,L1中从0-default
对应L1-L11
,而对于L1-L11
每一个都执行一个方法GOTO L12
,这样其实看不出来性能好在哪,但是啊,L1里面有一个这样的字段TABLESWITCH
,官方解释是什么呢
执行tableswitch 时,堆栈顶部的 int 值直接用作表中的索引,以获取跳转目标并立即执行跳转。整个查找+跳转过程是一个O(1) 操作,这意味着它非常快。
举个例子:假设此时a=5
,此时switc中共有high-low+1分支项
jvm遇到TABLESWITCH
指令的时候,会监测a是否在low~higth范围内,如果不在这个范围内,会直接跳转到default
,如果在这个范围内,那么就会用a指定的地点跳转。