Java中的 compareTo(), equals(), hashCode()方法 2021.06.04

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() 参考:

Java 重写 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());
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值