二个Long型id之间的比较:
Long permId = perm.getId();
if(permId == permRole.getPermissionId()){
return true;
}else{
return false;
}
其实二个值都是1050213964272697446L
输出:false
Long id1 = 28L;
Long id2 = 28L;
System.out.println(id1 == id2);
输出:true
这是个什么“鬼”?为什么不一样,接下来去找下源代码:
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]之间,会放在缓存里面,而超过这个范围就要new一个新的对象,也就是说==不能判断对象是否相等。自测的话A或者B值设置的都比较小,而测试会考虑多方便的效果,所以就GG了
下面调整如下:
Long permId = perm.getId();
if(permId.equals(permRole.getPermissionId())){
return true;
}else{
return false;
}
或
Long permId = perm.getId();
Long permId1 = permRole.getPermissionId();
if(permId.longValue() == permId1.longValue()){
return true;
}else{
return false;
}
输出:true
切记!程序猿得多看源代码!不然这个“鬼”不好确认呀!
长按二维码,更多内容等着你!
