integer a=100与integer b=100比较为true,integer a=300与integer b =300比较为false

Integer a=100与Integer b=100比较为true,Integer a=300与Integer b =300比较为false

案例一:
Integer a = 100;
Integer b = 100;

System.out.println(a==b);	// true
案例二:
Integer a = 300;
Integer b = 300;

System.out.println(a==b);	// false
案例三:
int c = 100;
int d = 100;

System.out.println(c==d);	// true
System.out.println(c=d);	// 100
解析:
integer.class源码
public static Integer valueOf(int var0) {
    return var0 >= -128 && var0 <= Integer.IntegerCache.high ? 		Integer.IntegerCache.cache[var0 + 128] : new Integer(var0);
}

Integer类中有个内部类:IntegerCache ,这个类中有一个缓存数组cache[ ],存放的内容是-128到127的整数。Integer a = 100实际在内部做了Integer.valueOf(100),判断a的值是否在-128—127之间。如果在此区间,则返回a+128作为整型数组 cache的下标,放在缓存中。如果不在,则创建新的对象new Integer(a)

private static class IntegerCache {
        static final int low = -128;
        static final int high;
        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 = new Integer[high - -128 + 1];
            var2 = -128;

            for(int var3 = 0; var3 < cache.length; ++var3) {
                cache[var3] = new Integer(var2++);
            }

            assert high >= 127;

        }
    }

可以看到high本身没有值,是var0=127赋给它的,而var0的值在这之前可能会改变。也就是说缓存上限的127其实是可以改变,可以从VM这个java.lang.Integer.IntegerCache.high中读取为上限,但是需要满足这个上限的值确实在-128和127之间。也就是说缓存的容量其实是可以改变的。基于这个特点,如果缓存的容量在-128到127之间,那么我们为了使用内存数据的高效性,可以将范围内大小的Integer放在同一缓存数组中,而不在范围内的则不放在缓存数组中,这也就是为什么下面的ValueOf方法中需要断言assert high值>=127的原因。

原文链接:https://blog.csdn.net/h704106603/article/details/70226193/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值