通过字节码分析i++ 与 ++i | Java Debug 笔记

199 阅读2分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看活动链接

一 字节码

字节码是java跨平台的利器,无论你写成何种方法,最终java来执行的都是字节码,同时字节码现在也变得越来越被学习者看中,例如多线程,例如解释一些效率的问题。

二 查看字节码

jvm命令:javap -c +执行的class文件

  1. i++的执行
  • 代码

      int a =0;
      int i=0;
      a = i++;
    
  • 字节码

      4: iload_2
      5: iinc          2, 1
      8: istore_1
      
    
  1. ++i的执行
  • 代码

      int a =0;
      int i=0;
      a = ++i;
      
    
  • 字节码

      ++i 的字节码执行
       4: iinc          2, 1
       7: iload_2
       8: istore_1
       
       
    

二 字节码执行分析

  1. 解释i++

    先将局部变量表中的第二个抽屉中的数据 放入栈,然后再对局部变量表的第二个抽屉进行+1,最后将栈中的数据放入到局部变量表;结果就是0,而区别就是我们最后读取的是栈中的数据,而+1缺失在局部表量表所以才是0;

  2. 解释++i

    首先iinc是对局部变量表中的数据进行 +1操作。那后面的 数值(2,1)是什么意思呢,先说下局部表量表,这个是jvm虚拟机栈中的一个空间,存储的是参数和局部变量,我们可以理解他为一个中药柜,里面有很多的抽屉,(2,1)就是向第二个抽屉中的数据+1

    然后iload_2 就是将局部变量表中的第二个变量,放入到操作栈中,也就是入栈,这时栈中的数据就是1了,然后执行istore_1就是将栈顶的数据赋值给局部变量,这时局部变量就是1了

三 结语

其实代码很少,但是解析还是用了一些jvm的知识,如果知识用看的,那么很难去理解其中的操作,但是如果自己实战下,不仅能够理解其中的意思,还能学到一些其他的知识,何乐而不为呢?