Integer的小秘密你知道吗?

Hello朋友们,我是RatelBlog的李某人。

记得很久之前,在网上看过一篇关于Integer比较值的问题,那么今天抽空复盘一下。
OK,那么代码如下

    @Test
    public void IntegerTeachingJunint() {
        Integer a1 = new Integer(200);
        Integer a2 = new Integer(200);
        logger.info("a1==a2: " + (a1 == a2));

        Integer a3 = new Integer(100);
        Integer a4 = new Integer(100);
        logger.info("a3==a4: " + (a3 == a4));

        Integer a5 = 100;
        Integer a6 = 100;
        logger.info("a5==a6: " + (a5 == a6));

        Integer a7 = new Integer(100);
        Integer a8 = 100;
        logger.info("a7==a8: " + (a7 == a8));

        Integer a9 = new Integer(100);
        int a10 = 100;
        logger.info("a9==a10: " + (a9 == a10));
    }
 OK 代码运行后,输出的结果如下,那么朋友们 你们都写对了吗?

 a1==a2: false
 a3==a4: false
 a5==a6: true
 a7==a8: false
 a9==a10: true


1.a1==a2、a3==a4输出是false,这个大家肯定都猜对了。
因为通过new关键字创建对象,实际上在JVM的堆内存创建了a1,a2,a3,a4四个对象,然后咱们通过==比较符,
比较a1==a2、a3==a4。实际上不是比较的数值,因为==比较的是地址,所以输出false。如果要比较数值
可以通过intValue()方法比较。列如:a1.intValue() == a2.intValue()。
2.a5==a6输出的是true,那么有些朋友是不是会产生疑问呢?难道此处的==比较符,不是比较的地址而是比较
的数值?其实不然,==还是比较的地址。Integer a5 = 100;Integer a6 = 100;这种方式编写,实则是调用了
Integer的valueOf(int i)方法。

源码如下:

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



private static class IntegerCache {
	static final int low = -128;
	static final int high;
	static final Integer cache[];

	static {
		// high value may be configured by property
		int h = 127;
		String integerCacheHighPropValue =
			sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
		if (integerCacheHighPropValue != null) {
			try {
				int i = parseInt(integerCacheHighPropValue);
				i = Math.max(i, 127);
				// Maximum array size is Integer.MAX_VALUE
				h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
			} catch( NumberFormatException nfe) {
				// If the property cannot be parsed into an int, ignore it.
			}
		}
		high = h;

		cache = new Integer[(high - low) + 1];
		int j = low;
		for(int k = 0; k < cache.length; k++)
			cache[k] = new Integer(j++);

		// range [-128, 127] must be interned (JLS7 5.1.7)
		assert IntegerCache.high >= 127;
	}

	private IntegerCache() {}
}

在Integer中存在IntegerCache内部类,那么在调用valueOf(i)方式时,先判断i是否在low,high范围中,
如果在low,high的范围中,返回cache数组中缓存的Integer对象,那么low,high值时多少呢?通过Debug
得出low=-128,high=127。那么就是说cache数组中缓存了-128~127的Integer对象,只要在-128~127的范
围中,通过valueOf(i)方法获取的就是cache中缓存的对象。
那么a5==a6为true就可以理解了,因为是在cache数组中取的同一个对象。
a7==a8: false。

这个很好理解,a7是在堆内存new的新对象,a8是在IntegerCache类中cache数组取的对象,
这两个不是同一个对象,==比较输出false。
 a9==a10: true。

这个也好理解 a10是基本数据类型,a9是Integer引用包装类型,在比较时会进行“拆箱”所以比较的是数值。
如果你不满意你的现状,要么开始改变,要么就闭嘴。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值