Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >从字节码角度解释i++和++i

从字节码角度解释i++和++i

作者头像
gzq大数据
发布于 2021-09-29 07:03:10
发布于 2021-09-29 07:03:10
51000
代码可运行
举报
文章被收录于专栏:大数据那些事大数据那些事
运行总次数:0
代码可运行
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  @Test
    public void test2(){
        int i = 10;
        i = i++;
        System.out.println(i);
    }

代码片段如上。 通过class文件反编译得到字节码指令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 0 bipush 10
 2 istore_1
 3 iload_1
 4 iinc 1 by 1
 7 istore_1
 8 getstatic #2 <java/lang/System.out : Ljava/io/PrintStream;>
11 iload_1
12 invokevirtual #3 <java/io/PrintStream.println : (I)V>
15 return

可以看到先是将10推到栈帧里的操作数栈的最底部,随后将其弹出到局部变量表的索引为1的位置,索引为0为this,再把局部变量表里索引为1的位置的数字放到操作数栈的最底部,随后进行局部变量表里的加一操作,此时确实局部变量表里索引为1的地方存储的是数字11,但是随即操作数栈里的顶部的10弹出又写回了局部变量表索引为1处,这时候调用getstatic指令调用指定类的静态域(out),并将其压入栈顶,又把局部变量表里的1放到了操作数栈顶,然后调用实例方法打印出10。 如下是++i的字节码指令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 0 bipush 10
 2 istore_1
 3 iinc 1 by 1
 6 iload_1
 7 istore_1
 8 getstatic #2 <java/lang/System.out : Ljava/io/PrintStream;>
11 iload_1
12 invokevirtual #3 <java/io/PrintStream.println : (I)V>
15 return

可以看见对调了isstore_1和iinc 1 by 1达到了不一样的效果。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/09/27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
从JVM层面来解释i++和++i的真正区别
但是这简单的回答并不能入吸引面试官的眼球,如果用java字节码指令分析则效果完全不同。
肉眼品世界
2021/07/13
4110
从JVM层面来解释i++和++i的真正区别
短文:用字节码解析i++和++i的区别
是不是很无聊,相信很多人会回答,i++是先赋值再+1,++i是先+1再赋值。确实是这样,但是我总是想追根溯源,如何解释这个原则?
源码之路
2021/02/02
8370
如何从字节码角度分析Java问题
很简单的两行代码,如果是你遇到这样的问题,你会怎样去把问题解释清楚?是利用Java运算符顺序将式子拆解,然后一步步运算,还是其他什么办法?
叫我阿柒啊
2022/05/09
6010
如何从字节码角度分析Java问题
JVM字节码与Java代码层调优
我们都知道,Java源代码不会像C/C++那样直接被编译为机器码,而是被编译成字节码,这造就了Java可以跨平台的特性。JVM实际执行的也是编译后的字节码,所以想要在Java代码层进行调优,就得对字节码有一定的了解。
端碗吹水
2020/09/23
4710
JVM字节码与Java代码层调优
敖丙字节一面:能聊聊字节码么?
上一篇《你能和我聊聊Class文件么》中,我们对Class文件的各个部分做了简单的介绍,当时留了一个很重要的部分没讲,不是敖丙不想讲啊,而是这一部分实在太重要了,不独立成篇好好zhejinrong 讲讲都对不起詹姆斯·高斯林
敖丙
2022/04/19
3420
敖丙字节一面:能聊聊字节码么?
从字节码层面分析==比较integer和int
可以看出先把两个1存到操作栈中,然后把操作栈中的1存到局部变量表中,最后在比较的时候再把两个1从局部变量表中放到操作数栈中执行if_icmpne逻辑判断来进行比较。其中astore和istore是精髓,astore代表把integer自动拆箱用来存储到局部变量表中。 当数值改为127以上时,唯一改变的字节码指令是iconst->sipush,这是因为: 取值-128~127采用bipush指令, 取值-32768~32767采用sipush指令 取值-2147483648~2147483647采用 ldc 指令。
gzq大数据
2021/09/23
3500
从JAVA字节码到方法运行
很简单的两行代码,如果是你遇到这样的问题,你会怎样去把问题解释清楚?是利用Java运算符顺序将式子拆解,然后一步步运算,还是其他什么办法?在思索一会儿之后,决定还是通过字节码指令来看看这两行代码是怎么运行的。
叫我阿柒啊
2022/05/09
5190
从JAVA字节码到方法运行
jvm之类文件详解(四)
Class 文件是一组以 8 位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在 Class 文件之中,中间没有添加任何 分隔符,这使得整个 Class 文件中存储的内容几乎全部是程序运行的必要数据,没有空隙存在。 当遇到需要占用 8 位字节以上空间的数据项时,则会按照高位在前(Big-Endian)的方式分割成若干个 8 位字节进行存储。 Class 文件只有两种数据类型:无符号数和表 链接:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html
周杰伦本人
2022/10/25
2080
jvm之类文件详解(四)
一个求水仙花数的类的字节码分析
使用javap得到字节码: javap -verbose com.dhb.geektimestudy.kimmking.week1.Hello
冬天里的懒猫
2021/08/10
2790
异常原理 | 优雅,永不过时
Java 虚拟机里面的异常使用 Throwable 或其子类的实例来表示,抛异常的本质实际上是程序控制权的一种即时的、非局部(Nonlocal)的转换——从异常抛出的地方转换至处理异常的地方。绝大多数的异常的产生都是由于当前线程执行的某个操作所导致的,这种可以称为是同步的异常。与之相对的,异步异常是指在程序的其他任意地方进行的动作而导致的异常。 Java 虚拟机中异常的出现总是由下面三种原因之一导致的:
不惑
2023/12/13
2580
异常原理 | 优雅,永不过时
[JVM] JVM自动内存管理机制(一)
文本主要就JVM结构和字节码文件,进行分析来展开JVM的学习,后续系列文章会从JVM的多个方面的进行知识总结。
架构探险之道
2019/09/09
5350
[JVM] JVM自动内存管理机制(一)
JVM内存与垃圾回收篇第5章虚拟机栈
https://docs.oracle.com/javase/specs/jvms/se8/html/index.html
yuanshuai
2022/08/22
4490
JVM内存与垃圾回收篇第5章虚拟机栈
程序员进阶系列:年少不懂爱家家,懂了已是猿中人。
时隔多年,回想起那个面试场景,忍不住要感叹:年少不懂i++(爱家家),如今懂了却已是老码农(双鬓白)。
一猿小讲
2020/09/01
3280
程序员进阶系列:年少不懂爱家家,懂了已是猿中人。
1、引言
栈帧对应一个线程的一个方法的内容,用于方法的执行,包括方法执行过程中的变量的临时状态。同时栈帧也执行动态链接,方法的返回值以及分发异常。栈帧被包含在JVM栈中。每一个栈帧包括:
文彬
2022/06/06
3900
1、引言
JVM学习笔记——类加载和字节码技术篇
在本系列内容中我们会对JVM做一个系统的学习,本片将会介绍JVM的类加载和字节码技术部分
秋落雨微凉
2022/11/16
5630
JVM学习笔记——类加载和字节码技术篇
001. JAVA程序运行原理分析
1. 先来看看JVM运行时数据区的结构 线程独占: 每个线程都有它独立的空间,随线程生命周期而创建和销毁。 线程共享: 所有线程能访问这块内存数据,随虚拟机GC 而创建和销毁。 方法区 JVM 用来存
山海散人
2021/03/03
4060
001. JAVA程序运行原理分析
深入理解 JVM 之——字节码指令与执行引擎
对于 C 语言从程序到运行需要经过编译的过程,只有经历了编译后,我们所编写的代码才能够翻译为机器可以直接运行的二进制代码,并且在不同的操作系统下,我们的代码都需要进行一次编译之后才能运行。
浪漫主义狗
2023/09/07
5650
深入理解 JVM 之——字节码指令与执行引擎
初识JVM指令执行流程
摘要: 记录下学习JVM指令执行流程的理解 正文: 初识JVM指令执行流程 /** * 0: aload_0 * 1: invokespecial #1 // Method java/lang/Object."<init>":()V * 4: return * * @author liugang * @since 2018-04-28 */ public class Example1 { /** * 为主方法创建一个frame并将其推入线程
itliusir
2018/05/21
5020
面试官:解释一下Java字节码文件中的JVM指令
Java 之所以流行,一个很重要的原因就是它的跨平台特性,Compile Once, Run Anywhere,编译一次,到处运行。即 Java 源码只需要编译成字节码文件,之后就可以在不同的操作系统(Windows、Mac、Linux)运行,准确讲是运行在操作系统上的 JVM 中。
南风
2019/11/22
7450
字节码文件 Krains 2020-08-04
得到反编译的字节码文件,这些信息都会通过classloader加载到方法区当中,但在运行时方法区中还包含了加载该class文件的classloader信息,当前只是反编译,没有经过classloader。
Krains
2020/08/05
2280
相关推荐
从JVM层面来解释i++和++i的真正区别
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验