前言
今天碰到个有趣的问题,简而言之就是Long类型能不能用==
来进行比较的问题。
先说结论,不是完全不行,但是不推荐。
原理
我们先明确一个观点,==
比较的是地址值,Long==Long比较的是两个对象的地址值是否相同。
我们看下jdk获取Long类型值的源码:
public static Long valueOf(long l) {
final int offset = 128;
if (l >= -128 && l <= 127) { // will cache
return LongCache.cache[(int)l + offset];
}
return new Long(l);
}
private static class LongCache {
private LongCache(){}
static final Long cache[] = new Long[-(-128) + 127 + 1];
static {
for(int i = 0; i < cache.length; i++)
cache[i] = new Long(i - 128);
}
}
可以看到,当值在-128~127之间的时候,用==
比较,实际取的缓存地址值,那么地址值当然一样,或者说值一样;但是,当值不在这个范围内,那么就是新建的Long对象,值就不相等了。
验证
public static void main(String[] args) {
Long a= 1L;
Long b = 1L;
System.out.println(a== b);
Long c=128L;
Long d=128L;
System.out.println(c==d);
System.out.println(c.compareTo(d));
}
//结果
true
false
0
总结,当值在-128-127之间,用==也可以,超出就不行。
不过,避免出错还是推荐compare
方法来比较大小。