目录
什么是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,会开辟新的内存空间。
早睡早起,注意身体,早起之王祝你风生水起——
不好意思,你的陷阱被我看破了。