Integer比较 ==与equals

class Test {

    public static void main(String[] args) {

        Integer i1 = new Integer(5);

        Integer i2 = new Integer(5);

        System.out.println(i1 == i2); //false (情况,即new的id,而不是=的id赋值)

         

        Integer i3 = 5;

        Integer i4 = 5;

        System.out.println(i3 == i4); //true

    }

}

所以判断Integer相等的值最好不要用==

下面为更为详细的解析:

public static void main(String[] args) { 
		// 实例一 
        Integer a1 = Integer.valueOf(60);
        Integer b1 = 60;    
        System.out.println("1:="+(a1 == b1));     
          
  		// 实例二
        Integer a2 = 60;    
        Integer b2 = 60;    
        System.out.println("2:="+(a2 == b2));    
          
  		// 实例三
        Integer a3 = new Integer(60);    
        Integer b3 = 60;    
        System.out.println("3:="+(a3 == b3));    
        
        // 实例四 
        Integer a4 = 129;    
        Integer b4 = 129;    
        System.out.println("4:="+(a4 == b4));    
    }  

答案

1:=true
2:=true
3:=false
4:=false

上述代码的答案,涉及到自动装箱的原理。

Integer b3 = 60, 这一步会触发自动装箱,也就是Integer b3 = Integer.valueOf(60)
查看Integer装箱的源码会发现Integer在装箱时会调用 IntegerCache缓存池,

public static Integer valueOf(String s) throws NumberFormatException {
        return Integer.valueOf(parseInt(s, 10));
    }

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

而IntegerCache会在类加载时,把-128-127之间的数全部创建一遍对象,放到Cache中。

所以实例一和实例二先后两次其实都是从缓冲区取的,都是同一个对象。
而实例三中a3是自己new出来的,没有走装箱方法,所以跟b3不是一个对象。
实例四超出了缓冲区范围,所以也不相等。

而Integer重写了equals方法,比较的是Intege的值,所以建议以后Integer比较直接用equals比较,或者先intValue()转成int后用==比较,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值