实例+源码 = 看破128陷阱

目录

什么是128陷阱

源码分析


什么是128陷阱

什么是128陷阱呢?如下:

Integer a1 = 10;
Integer a2 = 10;
System.out.println(a1 == a2);  true
Integer b1 = 128;
Integer b2 = 128;
System.out.println(b1 == b2);  false

可以看到,返回的结果并不是两个true。准确的说,按照上述形式来比较,在区间

-128 到 127 得到的结果都是true

为什么会有这个现象呢?我们先来分析一下:

  • Integer是包装类,是一个类,引用数据类型。
  • == 比较的是其地址。

由此可知 a1 和 a2 的地址一样,b1 和 b2 则不同。

源码分析

下面是Integer 内部的一段代码,有些部分被我省略,我们拿其中的几行来分析。

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;
            …………

            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() {}
    }

        不难看出,上述代码实现了,将 -127到128的数放在了一个 cache 数组中,是已经创建好的。

        如果在这一区间,会直接返回事先创建好的这一数组中的地址。所以用 == 来比较是相等的。

而不在这一区间的 b1 和 b2,会开辟新的内存空间。

早睡早起,注意身体,早起之王祝你风生水起——

不好意思,你的陷阱被我看破了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值