JAVA 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 所指向的对象就不是原来的对象了
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
相关文章
详解Spring FactoryBean灵活创建复杂对象的秘密武器
FactoryBean是Spring框架中用于创建复杂Bean的接口,通过编程方式控制Bean的创建过程,它允许开发者自定义Bean的创建逻辑,适用于集成第三方库、延迟初始化、动态代理和统一管理资源等场景,本文介绍Spring FactoryBean创建复杂对象的相关操作,感兴趣的朋友一起看看吧2025-02-02
如何解决SpringBoot2.6及之后版本取消了循环依赖的支持问题
循环依赖指的是两个或者多个bean之间相互依赖,形成一个闭环,SpringBoot从2.6.0开始默认不允许出现Bean循环引用,解决方案包括在全局配置文件设置允许循环引用存在、在SpringApplicationBuilder添加设置允许循环引用、构造器注入2024-10-10
CompletableFuture并行处理List分批数据demo
这篇文章主要介绍了CompletableFuture并行处理List分批数据实现实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-11-11


最新评论