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

作者:快乐柠檬 时间:2023-05-29 13:57:58 

程序目的

从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区:

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

图:i=i++字节码

字节码解读

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

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

图:编号为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的字节码

一篇文章带你从java字节码层理解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的局部变量表。

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

图:编号为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

来源:https://blog.csdn.net/limenghua9112/article/details/120415912

标签:java,i++,++i
0
投稿

猜你喜欢

  • Spring Boot 配置和使用多线程池的实现

    2022-09-04 19:53:02
  • C#中事件处理的个人体会

    2023-06-22 16:50:55
  • 详解Java中restTemplate的使用

    2023-06-19 23:20:29
  • ResultSet如何动态获取列名和值

    2022-01-16 15:54:01
  • Spring自定义注解配置简单日志示例

    2023-01-25 09:31:08
  • C#编程获取资源文件中图片的方法

    2023-05-23 06:13:39
  • Java main 方法面试题的详细整理

    2023-11-24 23:53:30
  • C#如何利用反射将枚举绑定到下拉框详解

    2022-09-12 01:48:09
  • Java多态成员访问的特点是什么?

    2022-08-23 03:07:22
  • 单独编译Android 源代码中的模块实现方法

    2021-08-20 07:00:46
  • java LRU(Least Recently Used )详解及实例代码

    2022-10-08 10:42:43
  • Spring整合Mybatis思路梳理总结

    2021-08-19 18:46:38
  • Java web spring异步方法实现步骤解析

    2023-12-19 03:14:58
  • Spring的@Autowired加到接口上但获取的是实现类的问题

    2023-08-23 21:32:21
  • java 验证用户是否已经登录与实现自动登录方法详解

    2021-10-21 13:49:50
  • android实现软件自动更新的步骤

    2022-12-27 00:48:17
  • Android入门之实现自定义Adapter

    2021-09-30 17:34:10
  • 深入理解Java8新特性之接口中的默认方法和静态方法

    2023-11-24 01:44:25
  • Android编程实现TextView部分颜色变动的方法

    2021-05-29 15:12:23
  • C#开发Windows服务实例之实现禁止QQ运行

    2023-04-13 03:29:29
  • asp之家 软件编程 m.aspxhome.com