hashCode和equals

equals是用于比较两个对象是否相同

  • 对象1.equals(对象2)
  • 每个对象的equals可以重写,自定义比较规则
kotlin 复制代码
@Data
public class Student {

  private Integer id;

  private String name;

  @Override
  public boolean equals(Object o) {
    if (this == o) {
      return true;
    }
    if (o == null || getClass() != o.getClass()) {
      return false;
    }
    Student student = (Student) o;
    return Objects.equals(id, student.id) && Objects.equals(name, student.name);
  }

}

student对象就是重写了比较规则,如果两个student id相同、name相同,就认为是同一个学生,如果不重写的话,student对象的equals方法就会调用Object的equals方法

hashCode方法

为什么要重写hashcode方法? 拿上面的例子来说,期望将学生放入HashSet,如果不重写hashSet,会导致即使认为是equals的两个对象被放入set两次,因为放入hashSet前会对对象做hash运算,两个对象如果不重写hashCode就会使用Object的hashCode,计算大概是通过对象地址然后加工处理得出,所以两个对象被认为hash值不同,认为是两个不同的对象

java 复制代码
Student student1 = new Student(1,"张三");
Student student2 = new Student(1,"张三");
student1.equals(student2); //返回true,因为重写了equals方法
HashSet<Student> hashSet = new HashSet<>();
hashSet.put(student1);
hashSet.put(student2);
hashSet.size() // 返回2,因为没有重写hashCode,被认为是不同对象多次放入

需要将student的hashCode进行手动重写
@Override
public int hashCode() {
    return Objects.hash(id, name); // 与 equals() 逻辑一致
}

总结

如果不使用hash相关的工具类集合,equals和hashCode是没有直接关联的,只不过Object的默认equals方法是使用的hashCode方法。 equals和hashCode都按相同规则重写,才会让hash集合可以正常工作

相关推荐
lpfasd1232 分钟前
Spring Boot 定时任务详解(从入门到实战)
spring boot·后端·python
moxiaoran57535 分钟前
Go语言的文件操作
开发语言·后端·golang
赴前尘21 分钟前
记一次golang进程执行卡住的问题排查
开发语言·后端·golang
码农小卡拉36 分钟前
Prometheus 监控 SpringBoot 应用完整教程
spring boot·后端·grafana·prometheus
计算机毕设VX:Fegn08951 小时前
计算机毕业设计|基于springboot + vue球鞋购物系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
苏渡苇1 小时前
用 Spring Boot 项目给工厂装“遥控器”:一行 API 控制现场设备!
java·人工智能·spring boot·后端·网络协议·边缘计算
短剑重铸之日2 小时前
《设计模式》第五篇:策略模式
java·后端·设计模式·策略模式
步步为营DotNet2 小时前
深入理解ASP.NET Core Middleware:管道执行机制与高效应用
后端·asp.net
独断万古他化3 小时前
【Spring 事务】事务隔离级别与事务传播机制:从理论到业务落地实操
java·后端·spring·事务隔离·事务传播
小高Baby@3 小时前
Go中常用字段说明
后端·golang·gin