何時要重寫equals

何時要重寫equals

當對象須要根據值去比較它們是否相等時,須要咱們重寫equals,而它的hashCode也同時須要被重要,通常來講就是對類裏全部成員變動求hashCode。ide

沒有重寫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()); 
  }
相關文章
相關標籤/搜索