*明明只匹配了case 0,为什么1和2也执行了? 很费解!按照惯用套路,看看字节码能不能给个答案。
_javac_编译和_javap_查看:
[https://www.jianshu.com/p/85c55be35cdd](()
tableswitch和lookupswitch都用于switch条件跳转,前者用于case值连续,例如上面代码中的0、1、2;后者用于case值不连续。
从字节码可以看出:switch中的case条件和对应代码块是分开的。如上图,case为0时,跳转到标号28代码处;为1时跳转到标号35代码处;为2时跳转到标号43代码处;default则跳转到标号49代码处。
这不,答案就出来了,当case 0匹配了之后,直接跳转到标号28代码处开始执行,输出0,然后策马奔腾,一路小下坡,顺序执行完后面所有代码,直到标号49 return,方法完执行完成,程序结束。
如果按照正常的思维,是不是case 0匹配之后,跳到28,执行完28、31、32输出0之后,就应该直接跳走,直接执行49。那么,这个"跳走”用字节码应该怎么表示?
用return?那不行,因为return会结束方法,这样switch后代码也无法执行。那怎么办嘞…

关于goto
goto:无条件跳转,goto 1表示跳转到标号1的代码处。
再写代码样例,这次在代码中给每个case都加上break。
public static void main(String[] args) {
int i = 0;
switch (i) {
case 0:
System.out.println(0);
break;
case 10:
System.out.println(1);
break;
case 2:
System.out.println(2);
break;
}
System.out.println(“Hello World”);
}
重新编译,再来看看字节码。
如图,与第一次的字节码相比,在标号35、45都有了goto指令。如果case 0匹配成功,则跳到标号28执行,执行完代码块对应的31、32指令之后,执行35的goto指令跳转到标号55,这样就跳出了switch作用范围,case 1和2也不会被执行。
等等,怎么少了一个goto,在标号55的上方应该还有一个goto才对!其实这就涉及到了_编译器优化技术_,最后一个goto也是跳转到标号55的指令,但没有goto下一步也一样顺序执行此行指令,所以这个goto被编译器视为无用代 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》开源 码进行了消除。
switch和if区别
技术学习总结
学习技术一定要制定一个明确的学习路线,这样才能高效的学习,不必要做无效功,既浪费时间又得不到什么效率,大家不妨按照我这份路线来学习。
最后面试分享大家不妨直接在牛客和力扣上多刷题,同时,我也拿了一些面试题跟大家分享,也是从一些大佬那里获得的,大家不妨多刷刷题,为金九银十冲一波!
了一些面试题跟大家分享,也是从一些大佬那里获得的,大家不妨多刷刷题,为金九银十冲一波!
[外链图片转存中…(img-K1LAz9iK-1650522959385)]
[外链图片转存中…(img-xBpYHj0K-1650522959386)]



