字节码角度探究i++、++i

文章详细解析了Java中i++和++i在字节码层面的区别,指出两者的实际效果在大多数情况下相同,但取决于上下文环境,如是否在方法返回时使用。通过实例展示了在main方法中调用这两种表达式的不同结果。
摘要由CSDN通过智能技术生成

1 i++ 和 ++i

1.1 代码

/**
 * @author wangsm
 * @description i++和++i 字节码角度区别
 */
public class IppTest {

    public void testIpp(){
        int i = 1;
        i++;
    }

    public void testPpi(){
        int i = 1;
        ++i;
    }

}

1.2 字节码

1.2.1 i++字节码

在这里插入图片描述

1.2.2 ++i字节码

在这里插入图片描述

1.3 结论

i++和++i的字节码没有任何区别,一毛一样。

2 打印i++、++i

2.1 代码

/**
 * @author wangsm
 * @description i++和++i 字节码角度区别
 */
public class IppTest {

    public void testIpp(){
        int i = 1;
        // 执行结果是 1
        System.out.println(i++);
    }

    public void testPpi(){
        int i = 1;
        // 执行结果是 2
        System.out.println(++i);
    }

}

2.2 字节码

testIpp 字节码
在这里插入图片描述
字节码解读,先将1压栈,然后赋值给变量表中第一个变量i,然后获取到静态变量out,再获取变量i的值加1(这里只是将局部变量表中a的值加上了1,操作数栈中的1没变),再将操作栈栈顶元素(就是1),传给虚方法println,打印1。

testPpi 字节码
在这里插入图片描述

2.2 分析

字节码差不多,唯一不同的是先执行iinc 1 by 1,还是先执行的iload_1,说白了就是,是先将i加1后再压入操作数栈,还是先将a压入操作数栈后再将i加1。

结论

在字节码角度,i++ 和 ++i 是完全一样的。造成结果不同的本质是先将变量入栈,还是先将变量+1。这取决于使用它们的上下文环境。

其他的案列

/**
 * @author wangsm
 * @description i++和++i 字节码角度区别
 */
public class IppTest {
    public static void main(String[] args) {
        // 结果:1
		System.out.println(testIpp());
		
		// 结果:2
		System.out.println(testPpi());
    }

    public static int testIpp(){
        int i = 1;
        return i++;
    }

    public static int testPpi(){
        int i = 1;
        return ++i;
    }

}

字节码对比
在这里插入图片描述

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值