0
点赞
收藏
分享

微信扫一扫

实例+源码 = 看破128陷阱

菜菜捞捞 2022-01-17 阅读 48
java

目录

什么是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,会开辟新的内存空间。

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

举报

相关推荐

128陷阱

简述128陷阱

java128陷阱

Java核心卷——128陷阱

Java包装类及128陷阱

vue源码 - 实例成员

0 条评论