首页 > 其他 > 详细

为啥重写了equals方法时一定要重写hashCode方法

时间:2020-05-11 13:54:27      阅读:50      评论:0      收藏:0      [点我收藏+]

为啥在重写了equals方法的时候一定要重写hashCode方法

在java中,Object类是所有类的基类,所以我们开发一个类的时候,它都默认继承了Object类;

在未重写这两个方法的时候,默认继承Object类的这两个方法:

Object类的equals方法,这里比较的是两个对象的地址是否相同;

public boolean equals(Object obj) {
  return (this == obj);
}

Object类的hashCode方法,返回的对象内存地址的值;

public native int hashCode();

以下定义一个Student类,来做详细说明

当一个类只重写了equals方法的时候,那么对象使用equals比较的时候为true(内容相等);

但是使用hashCode比较的话会为false,因为对象不同,地址不同;

public class Student {

    private int id;
    private String name;

    public int getId() {
      return id;
    }
    public void setId(int id) {
      this.id = id;
    }

    public String getName() {
      return name;
    }
    public void setName(String name) {
      this.name = name;
    }

    public Student(int id, String name) {
      this.id = id;
      this.name = name;
    }
    public Student() {
    }

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

测试:

public class Test {
    public static void main(String[] args) {

        Student s1 = new Student(1,"丁");
        Student s2 = new Student(1,"丁");

        System.out.println("s1和s2是否相等:"+s2.equals(s1));
        System.out.println("s1的hashCode值:"+s1.hashCode());
        System.out.println("s2的hashCode值:"+s2.hashCode());

    }
}

运行结果如下:

s1和s2是否相等:true
s1的hashCode值:1163157884
s2的hashCode值:1956725890

当重写了hashCode方法之后运行结果如下:

s1和s2是否相等:true
s1的hashCode值:20961
s2的hashCode值:20961

在重写equals和hashcode后,可以保证equals方法比较为true,hashcode方法比较一定为true;

但是hashcode值相同的两个对象,equals方法比较却不一定相等。

为啥重写了equals方法时一定要重写hashCode方法

原文:https://www.cnblogs.com/dingqf/p/12868507.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!