最近项目碰到一个问题,在判断两个Long类型数字相等的时候会出现不相等的情况。奇怪是在于Long类型数字大于127时直接用 == 判断会返回 false。
查询源码
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);
}
Long内部的类
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);
}
}
静态内部类LongCache中缓存 -128到+127的值
如果Long类型的值超过这个范围的时候就回去new一个新的对象,而 == 去判断相等就会报false了。
这个时候可以用 .longValue() 去比较两个数字 ==
public long longValue() {
return value;
}
或者通过 直接 .equals() 判断。
public boolean equals(Object obj) {
if (obj instanceof Long) {
return value == ((Long)obj).longValue();
}
return false;
}