BigDecimal 不能通过equals()方法比较大小
在使用实体中有BigDecimal类型的字段做为Map的key时,需要重写hashCode和equals。
而lombok默认生成的equals()方法,是用equals()比较的。所以需要自己手动重写hashCode和equals。
@Getter
@Setter
public class student{
private String name;
private BigDecimal grade;
@Override
public int hashCode(){
int result = 17;
result = 31 * result + (name== null ? 0 : name.hashCode());
result = 31 * result + (grade== null ? 0 : grade.intValue());
return result;
}
@Override
public boolean equals(Object obj){
if (this == obj){
return true;
}
if (obj == null){
return false;
}
if(obj instanceof student){
studentother = (student) obj;
//需要比较的字段相等,则这两个对象相等
return this.name.equals(other.name) && this.grade().compareTo(other.grade) == 0;
}
return false;
}
}
测试代码
public static void main(String[] args) {
student student1 = new student("1",new BigDecimal("1.00"));
student student2= new student("1",new BigDecimal("1.0"));
Map<student, String> map = Maps.newHashMap();
map.put(student1 , "test");
System.out.println(map.get(student2));
}
结果
test
PS:还是有一个问题,1.00和1.0的intValue()是一样的。而1.10和1.0的intValue()也是一样的,所以1.10和1.0的hashCode 是一样的,虽然结果没问题(因为有equals方法判断),但某种情形下无疑是增大了哈希碰撞。
有更好的解决方法,欢迎沟通,谢谢。