1.问题是什么
1)公司代码里的DO里写了一个 compareTo方法,用来进行排序。sonar说,如果写了compareTo方法后,还需要写 equals(), 写完 equals()方法后,又提示 要写 hashCode()方法。
所以这里给出来写 这几个函数的正确姿势
2.原因是什么
1)原因的话: 就是因为java中比较对象相等,需要 equals相等时,其 hashCode要一样,反之则不然。
3.怎么处理
1)解决:
compareTo:
根据自己的业务需求,比较对应字段,返回 1,-1,和0即可
equals:
偷懒的办法,就是直接使用 Java的超类 Object中的 equals()方法:
return (this == obj);
缺点是: 有的对象虽然不是指向堆中同一地址,但是其内容都是一样的,比如重复查询数据库的同一条数据的两个DO对象。
hashCode:
方法①: 将对象的各个属性的 hashCode值依次相加,Long, Integer, String 都可以
longValue.hashCode() + integerValue.hashCode() + stringValue.hashCode()
方法②: 借助于 @ToString 注解,使用 toString().hashCode()
return this.toString().hashCode()
主要还是根据需求来, 当然最偷懒的方法是
4.其他
1)源码: Object, Long等都可以通过Idea 查询所有位置的类来查看其源码
2)ToString() 注解,默认的不会带上 继承父类的属性
3) 如果需要 只比较某些属性相等,就认为两个对象是相等的,则可以重写 equals()和 hashCode方法。
== equlas方法仿照:
@Override
public boolean equals(Object o) {
//自反性
if (this == o) return true;
//任何对象不等于null,比较是否为同一类型
if (!(o instanceof Person)) return false;
//强制类型转换
Person person = (Person) o;
//比较属性值
return getId() == person.getId() &&
Objects.equals(getName(), person.getName()) &&
Objects.equals(getSex(), person.getSex());
}
————————————————
原文链接:https://blog.csdn.net/qq_40574571/article/details/94188940
== hashCode() 参考:
Objects.hash(Object... values) //return Arrays.hashCode(values);
== List 取差集
// 差集 (list1 - list2) List<MyVO> reduce1 = listVO1.stream().filter(item -> !listVO2.contains(item)).collect(toList()); // 差集 (list2 - list1) List<MyVO> reduce2 = listVO2.stream().filter(item -> !listVO1.contains(item)).collect(toList());