一 字节码
字节码是java跨平台的利器,无论你写成何种方法,最终java来执行的都是字节码,同时字节码现在也变得越来越被学习者看中,例如多线程,例如解释一些效率的问题。
二 查看字节码
jvm命令:javap -c +执行的class文件
- i++的执行
- 代码
int a =0;
int i=0;
a = i++; - 字节码
4: iload_2
5: iinc 2, 1
8: istore_1
- ++i的执行
- 代码
int a =0;
int i=0;
a = ++i; - 字节码
++i 的字节码执行
4: iinc 2, 1
7: iload_2
8: istore_1
二 字节码执行分析
- 解释i++
先将局部变量表中的第二个抽屉中的数据 放入栈,然后再对局部变量表的第二个抽屉进行+1,最后将栈中的数据放入到局部变量表;结果就是0,而区别就是我们最后读取的是栈中的数据,而+1缺失在局部表量表所以才是0;
- 解释++i
首先iinc是对局部变量表中的数据进行 +1操作。那后面的 数值(2,1)是什么意思呢,先说下局部表量表,这个是jvm虚拟机栈中的一个空间,存储的是参数和局部变量,我们可以理解他为一个中药柜,里面有很多的抽屉,(2,1)就是向第二个抽屉中的数据+1
然后iload_2 就是将局部变量表中的第二个变量,放入到操作栈中,也就是入栈,这时栈中的数据就是1了,然后执行istore_1就是将栈顶的数据赋值给局部变量,这时局部变量就是1了