什么时候要重写equals

栏目: Java · 发布时间: 5年前

内容简介:当对象需要根据值去比较它们是否相等时,需要我们重写equals,而它的hashCode也同时需要被重要,一般来说就是对类里所有成员变更求hashCode。一个类型Demo,有两个实例demo1和demo2,当没有直接比较它们时,它们是不相等的,因为它们的引用地址不相同。(在生成多字段的hashCode时,使用了类型的Objects.hash这个方法,它的源码如下

什么时候要重写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()); 
  }

以上所述就是小编给大家介绍的《什么时候要重写equals》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

STL源码剖析

STL源码剖析

侯捷 / 华中科技大学出版社 / 2002-6 / 68.00元

学习编程的人都知道,阅读、剖析名家代码乃是提高水平的捷径。源码之前,了无秘密。大师们的缜密思维、经验结晶、技术思路、独到风格,都原原本本体现在源码之中。 这本书所呈现的源码,使读者看到vector的实现、list的实现、heap的实现、deque的实现、Red Black tree的实现、hash table的实现、set/map的实现;看到各种算法(排序、查找、排列组合、数据移动与复制技术......一起来看看 《STL源码剖析》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具