所谓的字节码,就是一段“虚拟机的机器指令”。Java虚拟机你可以把它当成一个模拟器运行的真实计算机,拥有自己的硬件结构和指令集,字节码给人的感觉就像是汇编语言代码一样的。
idea软件自带查看字节码的功能,我们可以随便打一段运算来看一下:
int i=0;
i=i+1;
i+=1;
i+=2;
i++;
得到的字节码是
L0
LINENUMBER 6 L0
ICONST_0
ISTORE 1
L1
LINENUMBER 7 L1
ILOAD 1
ICONST_1
IADD
ISTORE 1
L2
LINENUMBER 8 L2
IINC 1 1
L3
LINENUMBER 9 L3
IINC 1 2
L4
LINENUMBER 10 L4
IINC 1 1
需要说明的是,JVM是基于栈操作的,所以字节码指令大多是对操作数栈进行运算操作。详细字节码大家可以去网上搜,或者参考《深入理解JAVA虚拟机》这本书。
第一行:在栈顶存一个常量0,然后出栈将其存到变量表1的变量里(也就是i啦)
第二行:首先把变量表1的数据读到栈顶,再压一个常量1到栈顶,再将栈顶两个数弹出来进行加运算并将结果压回栈顶,再将栈顶弹出保存在变量表1中。
第三四五行:直接对变量表1中存放的数进行自增。
不难发现除了第一条加运算被翻译成了4条字节码之外,其他三条都只被简单翻译成一条字节码。(因为JVM的指令集支持直接对变量表进行操作,省去了使用操作数栈的麻烦)。
得出一个结论:i++;和i+=1;这两行代码的执行效率完全一样。个人不推荐为了执行效率在(复杂)运算式中使用++、--这样的运算符,因为这会极大的降低代码的可读性,导致他人工作上的麻烦(当然,如果你的目的就是为了增加别人读你代码的时间成本,而且自己在读自己代码的时候不存在任何障碍,那么你可以这么做)。
P.S.:除了idea自带的Show ByteCode工具之外,你也可以添加JClassLib这个插件,它的功能更强,可以显示常量池等一些其他内容,但我觉得字体有点小很难看清(或许是我没找对方法)