RT,正常在写代码,然后发现出了bug,采用二分排除法才找到原因:ObjectUtils.equals(a,b)这个判断出现问题了。
大概实例代码如下:
1.
Map<String, Double> measureFlow = new HashMap<>();
int measure = 4;
measureFlow.put("measure",(double)measure);
2.
if (ObjectUtils.equals(measureFlow.get("measure"),4)) {
//业务代码
}
就是一个方法返回Map<String,Double>类型值,然后拿到map中的measure参数和数字4比较。本来应该是true的,结果却是false。
然后源码是这样的:
public static boolean equals(Object object1, Object object2) {
if (object1 == object2) {
return true;
} else {
return object1 != null && object2 != null ? object1.equals(object2) : false;
}
}
于是我进行测试:
System.out.println(measureFlow.get("measure")==4);返回是true,这个和源码里的object1 == object2 不是一样一样的吗?为什么源码里面就是false,我自己这样写就是true?
于是我断点看了一下,终于发现了问题:
原来,在进行比较的时候,基础类型的参数需要进行装箱,int类型的4被封装成了Integer,所以进行比较的两个对象一个是Double类型的,一个是Integer类型的,所以就是false了。