java.lang.Integer IntegerCache源码分析

 

1、给Integer赋值时,例如:

Integer a = 127;

Integer会初始化一个IntegerCache.cache的数组,数组里面存储-128 到 127之间的数字。初始化源码:

2、调用Integer.valueOf(int i)方法,如果i在-128 到 127之间,就会从IntegerCache.cache取出i对应的Integer对象;如果不在这个区间,就会返回new Integer(i);源码如下:

    public static Integer valueOf(int i) {
        assert IntegerCache.high >= 127;
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

运行如下代码,实际测试一下:

Integer a = 127;
Integer b = 127;
		
System.out.println(a == b); // 输出:true
System.out.println(a.intValue() == b.intValue()); // 输出:true
System.out.println(a.equals(b)); // 输出:true
Integer a = 128;
Integer b = 128;

System.out.println(a == b); // 输出:false
System.out.println(a.intValue() == b.intValue()); // 输出:true
System.out.println(a.equals(b)); // 输出:true
System.out.println(Integer.valueOf(128) == Integer.valueOf(128)); // 输出false
System.out.println(Integer.valueOf(127) == Integer.valueOf(127)); // 输出true

 

a=128,b=128时,debug可以看到a和b是两个不同的对象(id不同):

a=127,b=127时,debug可以看到a和b是同一个对象(id相同):

因为==比较的是对象的引用地址,当不是同一个对象时,==得出的肯定是false。

而equals方法被重写了,做的是值比对,所以equals输出的是true:

    public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值