zoukankan      html  css  js  c++  java
  • 通过字节码分析java中的switch语句

    在一次做题中遇到了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");
            }
        }
    }

    结果就不用说了。

  • 相关阅读:
    VUEX
    使用element框架 增加router路由
    VUE目录
    elementUI 创建
    VUE组件(父子组件)
    VUE操作DOM获取HTML、删除HTML、插入HTML
    VUE网络交互axios(网络请求库)
    VUE 或者JS 常用数据类型及方法:字符串、数组、对象
    VUE实际案例--计数器(商城数量加减)
    VUE学习 --数据类型、el挂点、指令等
  • 原文地址:https://www.cnblogs.com/gj15991875299/p/4609436.html
Copyright © 2011-2022 走看看