Java 的Integer、int与new Integer到底怎么回事?

先做一些总结:

1. int 和Integer在进行比较的时候,Integer会进行拆箱,转为int值与int进行比较。

2. Integer与Integer比较的时候,由于直接赋值的时候会进行自动的装箱,那么这里就需要注意两个问题,一个是-128<= x<=127的整数,将会直接缓存在IntegerCache中,那么当赋值在这个区间的时候,不会创建新的Integer对象,而是从缓存中获取已经创建好的Integer对象。二:当大于这个范围的时候,直接new Integer来创建Integer对象。

3. new Integer(1) 和Integer a = 1不同,前者会创建对象,存储在堆中,而后者因为在-128到127的范围内,不会创建新的对象,而是从IntegerCache中获取的。那么Integer a = 128, 大于该范围的话才会直接通过new Integer(128)创建对象,进行装箱。

实例分析:

public class TestDesign {
    public static void main(String[] args) {
            Integer i = new Integer(128);  
            Integer i2 = 128;
            System.out.println(i == i2);  
              
            Integer i3 = new Integer(127);  
            Integer i4 = 127;  
            System.out.println(i3 == i4);  
              
            Integer i5 = 128;  
            Integer i6 = 128;  
            System.out.println(i5 == i6);  
              
            Integer i7 = 127;  
            Integer i8 = 127;  
            System.out.println(i7 == i8);  
    }
    
}

运行结果如下图所示:

160946_Pbsb_3013327.png

第一个情况:

161403_wuCL_3013327.png

i 是创建的一个Integer的对象,取值是128。再对内存中会生成一个地址引用
i2 是进行自动装箱的实例,因为这里超出了-128--127的范围,所以底层还是通过new Integer(128)创建一个新的对象, 也会在堆内存中生成一个地址引用, 所以 i 和i2分别指向2个不同的对象

那么i和i2都是Integer的对象咯。存储在堆中,分配的地址不同,在使用==进行判读的时候,由于双方都是对象,所以比较对象的地址是不是相同,这里的地址是不同的,因为new的时候会在堆中重新分配存储空间。

第二个情况:

161805_A7r4_3013327.png

i3 是新创建的一个Integer的对象,取值是127.

i4 是进行自动装箱后生成的Integer的对象,其值-128<= i4 <= 127,所以在这里会与第一种情况有所不同,这个i4对象直接取缓存IntegerCache中的对应的对象,当然了也是对象。

那么i3和i4也都是对象咯,而且一个是缓存中的,一个自己new的,既然是对象那么==会比较其地址,因为都new出来的对象(一个是自己new出来的,一个是IntegerCache中new出来的对象),那么自然这两种情况下,在堆中分配的地址是不同的。

第三种情况:

162000_NSrJ_3013327.png

i5是自动装箱产生的Integer的对象,但是其大小超过了范围:-128<=A <=127,那么,这里会直接自己创建该对象即:new Integer(128);

i6和i5类似的原理。

显然这两个对象都是new出来,在堆中的地址值是不同的,那么==的时候判读其地址是不是相等,也就不一样了。

第四种情况:

162125_22pk_3013327.png

i7、i8是自动装箱产生的对象,其值都是127,那么这里很特殊的是127正好在-128<=i7<=127这个范围内的,那么会去IntegerCache中取,既然都是去IntegerCache中去取,那么自然该对象应该是一个对象,那么再堆中的地址应该是一样的,所以在判读两个对象是不是== 的时候,会输出true

下图是Integer类的源码

162916_WIAM_3013327.png

由此我们可以看出 当-128<=i<=127  的时候, 他就会到IntegerCache 中去直接拿取已经创建好的对象, 如果超出这个范围,那么就会创建一个新的对象。这就是Integer类的自动拆箱功能!

转载于:https://my.oschina.net/u/3013327/blog/891433

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值