首页 > 编程语言 >从jvm层面搞懂java的i++

从jvm层面搞懂java的i++

时间:2024-07-05 17:20:15浏览次数:14  
标签:操作数 java 字节 ++ 局部变量 栈中 搞懂 istore

> 本博客将从java字节码的层面解剖为什么i=0;i=i++;仍然会等于0

image-20240705164601567

字节码解析:

  • iconst_x:代表将常量x放到操作数栈中image-20240705164741928
  • istore_x:其中x必须是局部变量表中的一个合法下标,然后我们会从操作数栈中弹出对应的栈尾的元素(需要是int)以之来进行设置image-20240705165042321
  • iload_x:则是加载对应的局部变量表的x下标到操作数栈中
  • innc x by y:意思大概就是直接给局部变量表中x下标increase yimage-20240705165243552

解释

运行后的结果会是0,是因为

i=i++;

=号的优先级比较低,所以i=解析出的istore_1会在innc之后,而i++的命令转换完是这样的

//因为i在前所以会先iload_1,效果是将对应的局部变量数组中对应的i的值放到操作数栈中(注意这里之所以有iload是因为i在等号右侧)
iload_1
//而之后++对应的是innc 1 by 1,他是直接对局部变量数组中对应的i进行增加的--->这点的验证可以把i=i++改成i++;即可证明
innc 1 by 1
//而最后i=对应的优先级最低,所以解析出的istore_1在最后,且istore的作用是取操作数栈中的栈尾元素,而栈尾可没有+1,所以回到0的情况
istore_1

由此相信你对于i=++i;也能正确分析出字节码

下面仅作为答案展示:

image-20240705170107147

跨度为1的自增哪种效率最高

结论:

i++=i+=1>i=i+1,该结论仅从生成字节码数量进行讨论,实际测试在下方

image-20240705170429619

实测部分

由于int难分胜负,所以我采用了long,long在实际中的字节码数量会多不少,但是也同样能体现出这三种方法的效率不同,恰恰相反

image-20240705171234817

image-20240705171304857

image-20240705171345180

标签:操作数,java,字节,++,局部变量,栈中,搞懂,istore
From: https://www.cnblogs.com/seamount3/p/18286225

相关文章

  • C++基础语法篇
    一、语法1.定义变量并赋值:数据类型 变量名=值;2.宏常量定义#define会报错,提示转换:constexprauto数据类型常量名=常量值;3.定义普通(局部)常量:const 数据类型常量名=常量值;4.sizeof关键字,查询占用空间 sizeo......
  • 通信协议 | 一文搞懂SPI通信协议
    SPI的英文全称为SerialPeripheralInterface,顾名思义为串行外设接口。SPI是一种同步串行通信接口规范,主要应用于嵌入式系统中的短距离通信。该接口由摩托罗拉在20世纪80年代中期开发,后发展成了行业规范。SPI是一种高速的、全双工的、同步的通信总线,并且至多仅需使用......
  • Java流程控制
    Scanner对象Java给我们提供了这样一个工具类,我们可以获取用户的输入。java.util.Scanner是Java5的新特征,我们可以通过Scanner类来获取用户的输入。基本语法:Scanners=newScanner(System.in);通过Scanner类的next()与nextLine()方法获取输入的字符串,在读取前我们一般......
  • Java [ 基础 ] 方法引用 ✨
    ✨探索Java基础✨Java基础:方法引用方法引用是Java8中引入的一种新特性,它使得代码更加简洁和易读。方法引用提供了一种可以直接引用已有方法作为Lambda表达式的替代方案。本文将深入介绍方法引用的基本概念、使用方法、具体实例及其在实际开发中的应用。什么是方法引用?方法......
  • C++ 类型转换注意事项总结
    在C++中,类型转换是编程过程中不可避免的一部分,但不当的类型转换可能会导致程序错误、数据损坏甚至程序崩溃。因此,了解类型转换的注意事项至关重要。以下是C++类型转换时需要注意的几个方面:1.区分隐式类型转换和显式类型转换隐式类型转换:由编译器自动完成,无需程序员干预。......
  • java List集合排序方式
    javaList集合排序方式1.使用直接上代码packagecom.demo;importcn.hutool.core.date.DateTime;importlombok.AllArgsConstructor;importlombok.Data;importjava.util.*;importjava.util.stream.Collectors;publicclassDemoCollectionsSortMain{public......
  • 《C++ Primer》导学系列:第 17 章 - 标准库特殊设施
    17.1tuple类型C++11引入的tuple类型是一个可以包含多个不同类型元素的固定大小容器。tuple类似于pair,但其可以容纳多个元素,不限于两个。这使得tuple非常适合用来返回多个值的函数或者需要存储异构数据的场景。17.1.1定义和初始化tuple定义和初始化tuple非常简单,可以使用st......
  • C++语言相关的常见面试题目(三)
    1.List底层实现原理省流:list底层实现了一个双向循环链表。每个元素(或节点)包含三个部分:数据域(_M_Storage)、前驱指针(_M_prev)、后继指针(_M_next)。数据域:存储实际数据。前驱指针:指向链表中当前节点之前的一个节点。后继指针:指向链表中当前节点之后的一个节点此外,存......
  • Java EE改名Jakarta EE,jakarta对程序的影响
    一、前言很多Java程序员在使用新版本的Spring6或者springboot3版本的时候,发现了一些叫jakarta的包。我在阅读开源工作流引擎camunda源代码的时候,也发展了大量jakarta的工程包。比如:camunda的webapps编译工程就提供了2种方式javax和jakarta*`assembly`-Javasourcesandtes......
  • 基于javaweb二手闲置物品在线交易平台系统作品成品
     博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩。项目配有对应开发文档、开题报告、任务书、P......