一篇文章带你从java字节码层理解i++和++i

 更新时间:2021年09月26日 09:56:21   作者:快乐柠檬  
这篇文章带你从java字节码层理解i++和++i,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

程序目的

从java字节码层理解,为何i = i++后,结果是+1之前的数值。而i=++i后,结果是+1之后的值。

关键指令

iload_<n>:从局部变量表获取值,并压入操作数栈。

istore_<n>:出栈,然后存储到局部变量表。

i++示例源码

public class TestIPulsPlus {
	public static void main(String[] args) {
		int i = 8;
		i = i++;
//        i = ++i;
		System.out.println(i);
	}
}

i++执行结果:

8

使用jclasslib查看i++字节码

找到main方法的Code区:

在这里插入图片描述

图:i=i++字节码

字节码解读

0 bipush 8
把数值8压入操作数栈,压栈前转为int类型。
2 istore_1
8出栈,存到编号为1的局部变量表。

在这里插入图片描述

图:编号为1的局部变量为1

以上两行指令,完成了int i = 8;这行代码。

3 iload_1
从局部变量表,获取int值8。然后压到操作数栈。
4 iinc 1 by 1
把局部变量表中的i,进行+1操作。此时栈里面数值是8,局部变量表中i为9。
7 istore_1
8出栈,存到编号为1的局部变量表。也就是赋值给i变量。局部变量表的i值从9变为8。

接下来,解读i=++i的字节码

在这里插入图片描述

图:i=++i;字节码

++i示例源码

public class TestIPulsPlus {
	public static void main(String[] args) {
		int i = 8;
//		i = i++;
        i = ++i;
		System.out.println(i);
	}
}

执行结果为:

9

i=++i字节码解读

0 bipush 8
把数值8压入操作数栈,压栈前转为int类型。
2 istore_1
8出栈,存到编号为1的局部变量表。

在这里插入图片描述

图:编号为1的局部变量为1

以上两行指令,完成了int i = 8;这行代码。

3 iinc 1 by 1
把局部变量表中的i,进行+1操作。此时,局部变量表中i为9。
6 iload_1
从局部变量表,获取int值9。然后压到操作数栈。
7 istore_1
9出栈,存到编号为1的局部变量表。也就是赋值给i变量。

参考

Chapter 6. The Java Virtual Machine Instruction Set

总结

i=i++i=++i,第3、4行位置是相反的。

i++是先执行iload_1,再执行iinc 1 by 1。

iload_1:从局部变量表,获取int值8。然后压到操作数栈。

iinc 1 by 1 :把局部变量表中的i,进行+1操作。此时栈里面数值是8,局部变量表中i为9。

istore_1时,获取的是栈中的8,所以最后结果为8。

++i,是先执行iinc 1 by 1,再执行iload_1

iinc 1 by 1 : 把局部变量表中的i,进行+1操作。此时,局部变量表中i为9。

iload_1:从局部变量表,获取int值9。然后压到操作数栈。

istore_1时,获取的是栈中的9,所以最后结果为9。

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • 浅谈Java 中的引用类型

    浅谈Java 中的引用类型

    Java开发者肯定都很熟悉java中的4种引用类型,它们从强到弱分别是:强引用、软引用、弱引用和虚引用,下面我们详细看看这些引用类型
    2020-02-02
  • Java 蒙特卡洛算法求圆周率近似值实例详解

    Java 蒙特卡洛算法求圆周率近似值实例详解

    这篇文章主要介绍了蒙特卡洛算法的起源,特点,以及Java编程中利用蒙特卡洛算法计算圆周率近似值的实例,需要的朋友可以参考下
    2017-09-09
  • 简单了解JAVA NIO

    简单了解JAVA NIO

    这篇文章主要介绍了JAVA NIO的的相关资料,文中讲解非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • Springboot2集成pagehelper过程图解

    Springboot2集成pagehelper过程图解

    这篇文章主要介绍了springboot2集成pagehelper过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Java中的abstract和interface

    Java中的abstract和interface

    abstract和interface关键字在Java中随处可见,它是Java三大特性封装、继承、多态特性的实现重要支柱之一。interface关键字用于定义接口抽象,其本质上是用于定义类型、定义类所具有的能力,下面来看看详细内容,需要的朋友可以参考一下
    2021-11-11
  • 浅谈Java 三种方式实现接口校验

    浅谈Java 三种方式实现接口校验

    这篇文章主要介绍了浅谈Java 三种方式实现接口校验,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • 一文学会使用sa-token解决网站权限验证

    一文学会使用sa-token解决网站权限验证

    这篇文章主要为大家介绍了使用sa-token解决网站权限验证方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Java实现一键获取Mysql所有表字段设计和建表语句的工具类

    Java实现一键获取Mysql所有表字段设计和建表语句的工具类

    这篇文章主要为大家详细介绍了如何利用Java编写一个工具类,可以实现一键获取Mysql所有表字段设计和建表语句,感兴趣的小伙伴可以了解一下
    2023-05-05
  • 深度分析java dump文件

    深度分析java dump文件

    java内存dump是jvm运行时内存的一份快照,利用它可以分析是否存在内存浪费,可以检查内存管理是否合理,当发生OOM的时候,可以找出问题的原因。那么dump文件的内容是什么样的呢?
    2021-05-05
  • 关于Prometheus + Spring Boot 应用监控的问题

    关于Prometheus + Spring Boot 应用监控的问题

    这篇文章主要介绍了关于Prometheus + Spring Boot 应用监控的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03

最新评论