欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JAVA Integer类型自加实例详解

程序员文章站 2023-10-31 13:49:22
java语言中有一些基本数据类型,比如int,long,double...这些数据类型可以支持一些运算操作符,其中对于int类型的++/--操作符integer类型是一个对象类型,居然也可以支持++运...

java语言中有一些基本数据类型,比如int,long,double...

这些数据类型可以支持一些运算操作符,其中对于int类型的++/--操作符

integer类型是一个对象类型,居然也可以支持++运算,那么问题来了

一个integer对象执行++操作之后还是原来那个对象吗?

测试代码

public class integertest {

  @test
  public void test() {
    integer a = 1;
    system.out.println(system.identityhashcode(a));
    a++;
    system.out.println(system.identityhashcode(a));
  }
}

输出

105704967
392292416

对象的内存地址不一致,说明integer对象执行++操作之后是返回一个新的integer对象
可以通过查看汇编代码分析一下原因

简化代码

public class integertest {
  public void test() {
    integer a = 1;
    a++;
  }
}

上述代码的字节码

compiled from "integertest.java"
public class com.migoo.common.integertest {
 public com.migoo.common.integertest();
  code:
    0: aload_0
    1: invokespecial #1         // method java/lang/object."<init>":()v
    4: return

 public void test();
  code:
    0: iconst_1
    1: invokestatic #2         // method java/lang/integer.valueof:(i)ljava/lang/integer;
    4: astore_1
    5: aload_1
    6: astore_2
    7: aload_1
    8: invokevirtual #3         // method java/lang/integer.intvalue:()i
   11: iconst_1
   12: iadd
   13: invokestatic #2         // method java/lang/integer.valueof:(i)ljava/lang/integer;
   16: dup
   17: astore_1
   18: astore_3
   19: aload_2
   20: pop
   21: return
}

关于java字节码的介绍可以看一下这篇博客

我们主要关注8、13两行,底层使用了java/lang/integer.intvalue拆箱,然后自加,再通过java/lang/integer.valueof装箱,拆箱装箱操作之后变量a 所指向的对象就不是原来的对象了

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。