java中a=a+1和a+=1的区别介绍

 更新时间:2021年12月01日 11:46:47   作者:user2025  
这篇文章主要介绍了java中a=a+1和a+=1的区别,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

java a=a+1和a+=1的区别

在这里插入图片描述

测试用例调用的方法

  public static void test(Object obj) {
        System.out.println(obj.getClass());
    }

(1) 精度小于int(或long)的数值运算的时候都回被自动转换为int(或long)后进行计算,运算结果为

char i = 'a';
byte j = 2;
test(i + j);//class java.lang.Integer
byte i1 = 1;
short j1 = 2;
test(i1 + j1);//class java.lang.Integer

(2)char、byte、short、int、long等整形数和float(或double)进行计算,会自动先提升float(double),在进行计算

int i2 = 1;
float j2 = 1.5f;
test(i2 + j2);//class java.lang.Float

(3)float与double进行运算时,会float会先提升为double

float i3 = 1.2f;
double j3 = 1;
test(i3 + j3);//class java.lang.Double

(4)a=a+1和a+=1的区别

在这里插入图片描述

Java趣事a=a++和a=++a

如果问 a++ 和 ++a 的区别,估计很多都能回答上来。a++ 是先取 a 的值再自增 。而 ++a 刚好相反,是先自增再取 a 的值。这里有点编程基础都可以理解,不做过多解释,但在 Java 里面事情就真的这么简单吗?

int a = 1;
a = a++;
System.out.println(a);

凭借自己所学,在不测试的情况下,你能给出答案吗?

第一次看见这个问题的时候,想当然的认为答案是:2。但残酷的事实告诉我,答案是:1。当时面对这个结果我是无法接受的,网上疯狂搜索这个答案的解释。限于当时知识的水平,只记住了这个结论,至于推导这个结论那些指令,一个也不能理解。今天看书遇见数据操作,就又想起了这个问题,就根据自己的知识水平,重新推导这个过程。

首先用 IDEA 打开生成的 class 文件。

很直观的告诉我们结果为 1 ,但这段代码只解释了 result,而没有解释 why ,继续用 javap -c 这个命令,结果如图。

这里写图片描述

以第一次遇见这道题的水准,勉强能看懂第一步的 Java 代码,第二步的指令就彻底看不懂了。而现在我可以从这些指令里面分析结果了(这里需要分析的就前五行命令,后面指令为打印输出)。

  • iconst_1

将常量 1 压入操作数栈。这个操作是 int 值为 1~5 的时候。如果是 -128~127 这个范围是用的 bipush x (x 为实际数值)。 -2^15~2^15-1 这个范围是使用的 sipush x 这个命令(同上)。 -2^31~2^31-1 这个范围是使用的 ldc 这个命令。

  • istore_1

弹出操作数栈顶的数(此时为 1)并赋值给局部变量第一个元素即索引为 1 的 a。局部变量是采用的数组形式,索引为 0 的是 main() 的参数 args 。

  • iload_1

把局部变量索引为 1 的变量(这里是 a)压入操作数栈,此时栈顶元素为 1 。

  • incc 1,1(关键)

把局部变量索引为 1 的数加 1 ,此时 a 的值为 2。注意:这个结果没有压入操作数栈。

  • istore_1

弹出栈顶的元素(此时为 1)赋值给 a ,覆盖 a 为 2 的结果。

整个过程大致就是这样,来一幅图解释吧

这个问题解决了,那么下面这段代码就好理解了。

int a = 1;
a = ++a;
System.out.println(a);

直接上截图吧

仔细对比一下,你会发现,两段代码的指令一模一样,但执行顺序有一点点区别, iinc 和 iload_1 这两个命令的执行顺序变化了一下位置。你还记得这两条指令的含义吗?你还记得文章最开始说的区别吗?

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java实现大文件的切割与合并操作示例

    Java实现大文件的切割与合并操作示例

    这篇文章主要介绍了Java实现大文件的切割与合并操作,结合实例形式分析了java基于io及util操作大文件按指定个数分割与合并相关操作技巧,需要的朋友可以参考下
    2018-07-07
  • javaCV视频处理之提取人像视频

    javaCV视频处理之提取人像视频

    这篇文章主要介绍了利用JavaCV实现提取视频中的人像并保存为视频,文中的示例代码讲解详细,对我们学习JavaCV有一定的帮助,需要的可以参考一下
    2021-12-12
  • IDEA-Maven环境配置及使用教程

    IDEA-Maven环境配置及使用教程

    这篇文章主要为大家详细介绍了IDEA-Maven环境配置及使用教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • Springboot实现阿里云通信短信服务有关短信验证码的发送功能

    Springboot实现阿里云通信短信服务有关短信验证码的发送功能

    短信验证码是通过发送验证码到手机的一种有效的验证码系统。主要用于验证用户手机的合法性及敏感操作的身份验证。下面通过本文大家分享Springboot实现阿里云通信短信服务有关短信验证码的发送功能,一起看看吧
    2017-08-08
  • 关于Java中try finally return语句的执行顺序浅析

    关于Java中try finally return语句的执行顺序浅析

    这篇文章主要介绍了关于Java中try finally return语句的执行顺序浅析,需要的朋友可以参考下
    2017-08-08
  • IDEA+Maven搭建JavaWeb项目的方法步骤

    IDEA+Maven搭建JavaWeb项目的方法步骤

    本文主要介绍了IDEA+Maven搭建JavaWeb项目的方法步骤,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • SpringCloud服务注册和发现组件Eureka

    SpringCloud服务注册和发现组件Eureka

    对于微服务的治理而言,其核心就是服务的注册和发现。在SpringCloud 中提供了多种服务注册与发现组件,官方推荐使用Eureka。本篇文章,我们来讲解springcloud的服务注册和发现组件,感兴趣的可以了解一下
    2021-05-05
  • Java深入了解数据结构之二叉搜索树增 插 删 创详解

    Java深入了解数据结构之二叉搜索树增 插 删 创详解

    二叉搜索树是以一棵二叉树来组织的。每个节点是一个对象,包含的属性有left,right,p和key,其中,left指向该节点的左孩子,right指向该节点的右孩子,p指向该节点的父节点,key是它的值
    2022-01-01
  • 实例分析Java泛型

    实例分析Java泛型

    本篇文章通过代码实例给大家讲述了Java泛型的相关知识点以及相关的代码分析,对此有兴趣的朋友学习下。
    2018-02-02
  • SpringBoot使用Spring Security实现登录注销功能

    SpringBoot使用Spring Security实现登录注销功能

    这篇文章主要介绍了SpringBoot使用Spring Security实现登录注销功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-09-09

最新评论