java中int与Integer用==比较详解

前言:

越是简单的东西,我们往往越是没有去把它明白,但我们大部分时间又常常在用,就像我们今天说的int与Integer的使用,我们程序员基本天天都在用,但是我今天没用详细弄清楚之前我也是不清楚,我们来看看这两个在用==号比较给我们带来的疑问。

先看看下面的代码,看看我们是否都会

 @Test
	public void testEquals() {
		int int1 = 12;
		int int2 = 12;
	
		Integer integer1 = new Integer(12);
		Integer integer2 = new Integer(12);
		Integer integer3 = new Integer(127);
		
		Integer a1 = 127;
		Integer a2 = 127;
		
		Integer a = 128;
		Integer b = 128;
			
		System.out.println("int1 == int2 -> " + (int1 == int2));					
		System.out.println("int1 == integer1 -> " + (int1 == integer1));			
		System.out.println("integer1 == integer2 -> " + (integer1 == integer2));	
		System.out.println("integer3 == a1 -> " + (integer3 == a1));				
		System.out.println("a1 == a2 -> " + (a1 == a2));							
		System.out.println("a == b -> " + (a == b));													
	}  

答案是:

1、   int1 == int2 -> true
2、   int1 == integer1 -> true
3、   integer1 == integer2 -> false
4、   integer3 == a1 -> false
5、   a1 == a2 -> true
6、   a == b -> false

看看结果跟我们自己做的是不是都一样。
下面我们就来详细解释一下,为什么是上面的结果。(下面的序号就是对应的是上面的答案序号)
1、int1 == int2 为true,这个我就不讲了,这个都知道
2、int1 == integer1,Integer是int的封装类,当Integer与int进行==比较时,Integer就会拆箱成一个int类型,所以还是相当于两个int类型进行比较,这里的Integer,不管是直接赋值,还是new创建的对象,只要跟int比较就会拆箱为int类型,所以就是相等的。
3、integer1 == integer2 -> false,这是两个都是new出来的对象,都会在堆上开辟一块自己的内存空间,而且不会进行拆箱比较,所以不等
4、integer3 == a1 -> false , integer3是一个new出来的对象类型会在堆上开辟自己的内存空间,而a1是一个在-128和127范围的常量,直接引用缓存中的值放在了方法去的常量池中,它们存放内存的位置不一样,所以也不等。
5、6 看起来是一模一样的为什么一个是true,一个是false,这是因为Integer作为常量时,在常量池中对于-128到127之间的这样小的高频率的整形数会在jvm初始化的时候的时候缓存到缓存中,这样减少了在常量池中创建的开销。无论是a1还是a2的值都是引用的缓存中的同一个值,所以a1 == a2的。当超过这个范围就是new Integer()来new一个对象了,所以a、b都是new Integer(128)出来的两个对象,所以它们不等。

这里还涉及一个装箱和拆箱的知识点,当Integer a = 10;这样的整形数据赋值给一个包装类的时候,实际上他会执行一个装箱的过程,就是:java在编译Integer i = 10时,会翻译成为Integer i = Integer.valueOf(100);所以关键就是看valueOf()函数了。JDK源码的valueOf()是这样的


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);
}

源码中我们也可以看出,在-128和127范围的时候会直接取出缓存的值,而不在找个范围的时候,就会new Integer()来创建一个新的对象。

根据以上总结:
①、无论如何,Integer与new Integer不会相等。因为它们存放内存的位置不一样。在缓存范围的时候是缓存中的值和内存中开辟的新对像的比较,不在缓存范围的时候,是开辟的2个内存空间的对象的地址的比较。都不会相等。
②、两个都是非new出来的Integer,如果数在-128到127之间,则是true,否则为false。
③、两个都是new出来的,则为false。
④、int和integer(new或非new)比较,都为true,因为会把Integer自动拆箱为int,其实就是相当于两个int类型比较。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值