通过字节码分析java中的switch语句
2015-06-30 09:14
465 查看
在一次做题中遇到了switch的问题,由于对switch执行顺序的不了解,在这里简单的通过字节码的方式理解一下switch执行顺序(题目如下):
public class Ag{ static public int i=10; public static void main(String []args){ switch(i){ default: System.out.println("this is default"); case 1: System.out.println("this is one"); case 2: System.out.println("this is two"); case 10: System.out.println("this is ten"); case 5: System.out.println("this is five"); } } }
输出为:
下面通过例子来分析一下switch:
一、首先代码1如截图所示:
简单说一下代码,代码很简单,就是在一个类中建一个main方法,然后在main方法中使用一个switch语句(注意了,这个代码中default在最前面),然后通过javap工具获取字节码,进而对switch的执行方式进行分析,得到的字节码截图如下:
字节码分析如下:
public static void main(java.lang.String[]); Code: 0: iconst_5//将常量5进入操作栈 1: istore_1//将栈顶数据存入局部变量1 2: iload_1//将第一个局部变量入栈 3: lookupswitch { // 2 //出现switch那必然是switch语句了 1: 33 //当a==1时,执行标号33的语句 2: 38 //当a==2时,执行标号38的语句 default: 28 //default情况下,虽然语句在前面,但是判断依然最后判断,执行标号28的语句 } 28: iconst_5 //开始执行default里面的内容 29: istore_2 //28和29语句类似于int b =5 30: goto 43 //由于使用了break,跳出了语句,所以执行语句43,也就是跳出了switch,下同 33: iconst_5//开始执行a==1时的操作 34: istore_2 35: goto 43 //如果不用break,将继续执行接下来的语句,而不是跳出switch 38: iconst_5 //开始执行a==1时的操作</span> 39: istore_2 40: goto 43 43: return //main方法执行结束
二、第二个测试代码(default放到了最后面):
同样的简单说一下代码,代码很简单,就是在一个类中建一个main方法,然后在main方法中使用一个switch语句(注意了,这个代码中default在最后面),然后通过javap工具获取字节码,进而对switch的执行方式进行分析,得到的字节码截图如下:
字节码分析如下,只需关注两次代码中字节码的异同点:
public static void main(java.lang.String[]); Code: 0: iconst_5 1: istore_1 2: iload_1 3: lookupswitch { // 2 1: 28 2: 33 default: 38 //值得注意的是default依然在最后面,唯一变化的就是执行语句的位置 } 28: iconst_5 //a==1语句的执行位置 29: istore_2 30: goto 43 33: iconst_5 //a==2语句执行的位置 34: istore_2 35: goto 43 38: iconst_5 //default语句执行的位置 39: istore_2 40: goto 43 43: return }
总结:
从上面的两个代码中可以得到:
1、不管switch中default位置如何,它都是最后一个进行判断的;
2、虽然default是最后一个进行判断的,但是default中的语句的位置依然和default在句中的位置有关(这句话接近于废话,但是,当case语句中没有break时,整个switch也就类似于顺序的去执行)
3、当case中没有break时,它的执行顺序和执行方式就是继续向下执行,直到switch结束或者遇到break。
最后来一个小例子测试一下对本文的分析(怎么这么眼熟,对,就是最开始的那个代码稍微改了一点):
public class Ag{ static public int i=10; public static void main(String []args){ switch(i){ default: System.out.println("this is default"); case 1: System.out.println("this is one"); case 2: System.out.println("this is two"); case 5: System.out.println("this is five"); } } }
结果就不用说了。
相关文章推荐
- 通过字节码分析java中的switch语句
- (编程语言中)后置++(即i++),分别通过汇编和字节码分析其在vs2012 C++和java中区别
- 通过字节码深入分析java的枚举类型enum
- 通过分析SQL语句的执行计划优化SQL(六)
- 通过分析SQL语句的执行计划优化SQL (七)
- Android系统原理与源码分析(1):利用Java反射技术阻止通过按钮关闭对话框
- 通过分析SQL语句的执行计划优化SQL (五)
- 通过分析SQL语句的执行计划优化SQL(四)
- Java笔记——switch语句中使用Enum注意点
- Java switch-case语句用法
- 通过分析SQL语句的执行计划优化SQL (九)
- 通过分析SQL语句的执行计划优化SQL
- 通过Java thread dump分析找到耗费CPU最高的源代码
- switch-case 语句的优点和几点注意事项 Java
- 通过身份证分析出生年月日、性别、年龄的SQL语句
- 毕向东_Java基础视频教程-第02天-switch语句的特点
- Java温故知新 - Switch语句
- java switch语句(翻译自Java Tutorials)
- 通过分析SQL语句的执行计划优化SQL
- [转]通过分析SQL语句的执行计划优化SQL (七)[5]