欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

什么时候要重写equals

程序员文章站 2022-04-09 08:32:52
什么时候要重写equals 当对象需要根据值去比较它们是否相等时,需要我们重写equals,而它的hashCode也同时需要被重要,一般来说就是对类里所有成员变更求hashCode。 没有重写equals时 一个类型Demo,有两个实例demo1和demo2,当没有直接比较它们时,它们是不相等的,因 ......

什么时候要重写equals

当对象需要根据值去比较它们是否相等时,需要我们重写equals,而它的hashcode也同时需要被重要,一般来说就是对类里所有成员变更求hashcode。

没有重写equals时

一个类型demo,有两个实例demo1和demo2,当没有直接比较它们时,它们是不相等的,因为它们的引用地址不相同。(默认情况下,equals和==是一样的,比较引用类型的内存地址

需要根据值比较相等时要重写它们

class demo {
  private string name;
  private string email;

  public string getemail() {
    return email;
  }

  public void setemail(string email) {
    this.email = email;
  }

  public string getname() {
    return name;
  }

  public void setname(string name) {
    this.name = name;
  }

  @override
  public boolean equals(object o) {
    if (this == o) return true;
    if (o == null || getclass() != o.getclass()) return false;
    demo demo = (demo) o;
    return objects.equals(name, demo.name) &&
        objects.equals(email, demo.email);
  }

  @override
  public int hashcode() {

    return objects.hash(name, email);
  }
}

在生成多字段的hashcode时,使用了类型的objects.hash这个方法,它的源码如下

  public static int hashcode(object a[]) {
        if (a == null)
            return 0;

        int result = 1;

        for (object element : a)
            result = 31 * result + (element == null ? 0 : element.hashcode());

        return result;
    }

使用单元测试校验结果

  @test
  public void hashcode() {
    demo demo1 = new demo();
    demo1.setname("zzl");
    demo demo2 = new demo();
    demo2.setname("zzl");
    assert.assertequals(demo1.getname().hashcode(), demo2.getname().hashcode());
    assert.assertequals(demo1.hashcode(), demo2.hashcode()); 
  }