面试题之 字节码角度看i++和++i

133 阅读2分钟

i++ image.png 字节码指令解释:
0 bipush: 将100压栈到操作数栈
2 istore_1: 弹出操作数栈中的栈顶元素(值)存到局部变量表中的第一个(index=1,第0个位置是this)位置,目前i还是100
3 iload_1:将局部变量表中的第一个变量的值存放到操作数栈中(这里还是100)
4 iinc 1 by 1: 意思是将局部变量表中的第一个位置的变量按常量1增加。第一个位置1代表索引,第二个1表示常量(这时候的局部变量表的下标为1的位置已经是101)
接下来是关键:
7 istore_1:将操作数栈中的栈底部元素(值)存到局部变量表中的第一个(index=1,第0个位置是this)位置,这里的i还是100,因为并没有将局部变量表运算之后的结果压入到操作数栈,所以i=100

++i image.png 0 bipush: 将100压栈到操作数栈
2 istore_1: 将操作数栈中的栈顶元素(值)存到局部变量表中的第一个(index=1,第0个位置是this)位置,这里的i还是100
3 iinc 1 by 1: 意思是将局部变量表中的第一个位置的变量按常量1增加。第一个位置1代表索引,第二个1表示常量(这时候的局部变量表的下标为1的位置已经是101)
接下来是关键:
6 iload_1 将局部变量表中的下标为1的变量的值存放到操作数栈中(这里的1是101)
7 istore_1:将操作数栈中的栈顶元素(值)存到局部变量表中的第一个(index=1,第0个位置是this)位置,因为指令6已经将运算后的结果101压入了操作数栈,所以指令7 从栈取出的i是101,所以i=101