java - 覆盖 hashCode() 和 equals() 方法

标签 java overriding equals hashcode

  1. 我重写了 hashCode() 和 equals(),但是我没有修改重写方法中的任何内容

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 67 * hash + Objects.hashCode(this.model);
        hash = 67 * hash + this.year;
        return hash;
    }
    
    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final PC other = (PC) obj;
        if (!Objects.equals(this.model, other.model)) {
            return false;
        }
        if (this.year != other.year) {
            return false;
        }
        return true;
    }
    
  2. 我创建了 2 个相同的对象:

    PC One = new PC();
    
    One.setModel("HP");
    
    One.setYear(2013);
    
    PC Two = new PC();
    
    Two.setModel("HP");
    
    Two.setYear(2013);
    
  3. 我比较了这两个对象:

     if (One.equals(Two)) {
    
            System.out.println("They are the same objects!");
    
      } else {
    
           System.out.println("They are different objects!");
       }
    

结果是:“它们是相同的对象!”。但是,如果我不重写这两种方法,结果将是:“它们是不同的对象!”。 因为 hashCode 对于每个对象都是唯一的(我想),所以我期望结果是:“它们是不同的对象!”。 问:为什么?

最佳答案

Object 的默认equals 实现使用实例的引用地址。两个 对象 仅当它们位于内存中的相同位置时才相等。

如果您不重写 equals,那么您将获得该实现。

此外,此行为与 hashCode 无关,因为您没有调用 hashCode。如果您直接调用 equals,则不会使用 hashCodehashCodeHashMap 一样,一般用于数据结构中。

关于java - 覆盖 hashCode() 和 equals() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26242832/

相关文章:

Java如何覆盖Exception.getMessage

c# - 为什么比较每个 C# 字典键/值对给出不同的结果,而不是一次完成比较字典键和值?

C# GetHashCode 问题

java - <tx :annotation-driven/> leads to java. lang.ClassNotFoundException : org. aopalliance.aop.Advice

java - 如何删除 Activity 中的数据?

java - 如何在java中制作平滑的模糊效果?

html - 如何在开发工具中修复 CSS 属性的覆盖?

java - 当 Equals 被覆盖以始终返回 False 时,HashMap 和 Hashtable 的不同行为

css - 覆盖溢出的基本 CSS : hidden; property

java - 是否应该在 equals 和 hashCode 中考虑 JPA 实体的 id 字段?