Integer赋值Integer i=5与Integer i=new Integer(5)是否等价及内存分配问题
Java两种Integer初始化方式的核心差异
1. 运行效果是否等价?
两者不完全等价:
- 如果仅读取变量存储的数值、做算术运算、调用
equals()比较值,两者的表现没有差异 - 但如果用
==做引用相等性判断,差异会直接体现:
比如Integer a = 5; Integer b = 5;中a == b返回true;但Integer a = new Integer(5); Integer b = new Integer(5);中a == b返回false
2. 内存分配逻辑差异
两者的内存分配逻辑完全不同,不是同一种堆分配方式:
- 对应写法
Integer i = 5;
这是Java自动装箱机制,底层实际执行的是Integer i = Integer.valueOf(5);。Integer内部维护了IntegerCache缓存池,默认会缓存-128~127区间的所有Integer对象,赋值的数值如果在缓存区间内,会直接返回缓存池中的已有对象引用,不会额外在堆中分配新内存;只有数值超出缓存区间时,才会新创建对象分配堆内存。 - 对应写法
Integer i = new Integer(5);
这是显式调用Integer的构造方法创建新对象,无论传入的数值是否在缓存区间内,都会直接在堆上申请一块新的内存空间存储当前Integer对象,完全不会复用缓存中的已有对象。
补充说明:从Java 9开始,
Integer(int)构造方法已被标记为废弃,官方更推荐使用自动装箱或Integer.valueOf()的写法,减少不必要的对象创建,降低内存开销。
内容的提问来源于stack exchange,提问作者Pedro Gómez
相关产品推荐
相关产品推荐

