Java面试题03-Integer对象的相等

Java面试题03-Integer对象的相等

问题

	public static void main(String[] args){
        Integer i1 = 100;
        Integer i2 = 100;

        Integer i3 = 128;
        Integer i4 = 128;

        System.out.println(i1 == i2);
        System.out.println(i3 == i4);
    }

解决

	public static void main(String[] args){
        Integer i1 = 100;
        Integer i2 = 100;

        Integer i3 = 128;
        Integer i4 = 128;

        System.out.println(i1 == i2); // true
        System.out.println(i3 == i4); // false
    }

看到这里,一些小伙伴可能感觉,嘶,这不对吧,128和128咋还不一样呢,这不对吧这是,哈哈,其实这个是没问题的。

这个问题其实就涉及到Integer的源码底层了,我们看如下源码,这是Integer源码中的一个内部类,通过类名我们可以知道应该是一个类似缓存的类。

private static class IntegerCache {
		// 最低数值
        static final int low = -128;
        // 最高数值
        static final int high;
        // 缓存cache数组
        static final Integer[] cache;

        private IntegerCache() {
        }

        static {
            int var0 = 127;
            String var1 = VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
            int var2;
            if (var1 != null) {
                try {
                    var2 = Integer.parseInt(var1);
                    var2 = Math.max(var2, 127);
                    var0 = Math.min(var2, 2147483518);
                } catch (NumberFormatException var4) {
                }
            }

            high = var0;
            // 指定cache数组的大小
            cache = new Integer[high - -128 + 1];
            var2 = -128;
			// 将-128到127的数值放入cache数组
            for(int var3 = 0; var3 < cache.length; ++var3) {
                cache[var3] = new Integer(var2++);
            }

            assert high >= 127;

        }
    }

实际上,这段源码的主要意思大概就是,Integer设置了一个缓存区间cache数据,这个区间的大小是[-128,127]。所以当我们在调用 new Integer的时候,如果该值在这个区间内,Integer就会将该对象存储缓冲区,当再次创建该值时,会先去缓冲区获取;如果获取到就返回,如果没有获取到就创建该对象存入缓冲区并返回。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值