• 什么时候要重写equals


    什么时候要重写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()); 
      }
    
  • 相关阅读:
    算法导论学习 之 插入排序
    python 的模块导入
    Python 模块的发布与上传
    Python 自学笔记《1》
    linux内核可以接受的参数 | Linux kernel启动参数 | 通过grub给内核传递参数
    Linux系统安装时分区的选择(推荐)
    Oracle 11G在用EXP 导出时,空表不能导出解决
    android TextView属性详解
    android中dip、dp、px、sp和屏幕密度
    android ImageView scaleType属性
  • 原文地址:https://www.cnblogs.com/lori/p/10907633.html
Copyright © 2020-2023  润新知