所谓的字节码,就是一段“虚拟机的机器指令”。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这个插件,它的功能更强,可以显示常量池等一些其他内容,但我觉得字体有点小很难看清(或许是我没找对方法)