JAVA Integer类型自加实例详解
程序员文章站
2022-06-14 15:19:37
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 所指向的对象就不是原来的对象了
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。