中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

什么時候(hou)要重(zhong)寫equals

什么時候要重寫equals

當對(dui)象需(xu)要(yao)根據值去(qu)比較它們(men)(men)是否相等時(shi),需(xu)要(yao)我們(men)(men)重(zhong)寫equals,而它的hashCode也同時(shi)需(xu)要(yao)被重(zhong)要(yao),一般來說就是對(dui)類(lei)里所(suo)有成員變更求(qiu)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);
  }
}

在(zai)生成多字段的(de)hashCode時,使用了類型的(de)Objects.hash這(zhe)個方法,它的(de)源(yuan)碼(ma)如下

  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()); 
  }
posted @ 2019-05-22 18:06  張占嶺  閱讀(2536)  評論(0)    收藏  舉報