首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用超类hashCode和对象重写hashCode

用超类hashCode和对象重写hashCode
EN

Stack Overflow用户
提问于 2019-03-29 15:53:45
回答 1查看 1K关注 0票数 1

我需要使用super.hashcode()计算this.hashcode()吗?

IDE (例如IntelliJ Idea )可以生成等于和哈希码。它可以使用java.util.Objects。它还可以覆盖super.hashcode()。

代码语言:javascript
复制
//Immutable class to put it into a hash set.
class Person {

    private final String name;
    // Constructor of not null, getter

    @Override
    public boolean equals(final Object o) {
        if (this == o) return true;
        if (!(o instanceof Person)) return false;
        final Person that = (Person) o;
        return Objects.equals(name, that.name);
    }

    // Auto generated by idea.
    @Override
    public int hashCode() {
        return Objects.hash(super.hashCode(), name);
    }

    @Override
    public String toString() {
        return name;
    }
}

现在让我们有两个同名的实例。他们的密码会不一样。

代码语言:javascript
复制
public static void main(String[] args) {
    Person person1 = new Person("John");
    Person person2 = new Person("John");

    System.out.println("People are equal: " + person1.equals(person2));
    System.out.println("Person 1: " + person1 + ", Hash code: " + person1.hashCode());
    System.out.println("Person 2: " + person2 + ", Hash code: " + person2.hashCode());

    Set<Person> people = new HashSet<>();
    people.add(person1);
    people.add(person2);

    System.out.println("People: " + people);
}

它会打印不同的哈希码。

代码语言:javascript
复制
People are equal: true
Person 1: John, Hash code: -1231047653
Person 2: John, Hash code: -1127452445
People: [John, John]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-29 15:56:42

在您的示例中,您不应该使用super.hashCode(),因为它将调用Object标识hashCode()。这将破坏equals(),根据 javadoc is

hashCode的总合同是:

  • 每当在执行Java应用程序期间在同一个对象上多次调用它时,hashCode方法必须始终如一地返回相同的整数,前提是不修改关于该对象的相等比较中使用的任何信息。从应用程序的一次执行到同一应用程序的另一次执行,这个整数不需要保持一致。
  • 如果两个对象根据equals(Object)方法相等,那么对两个对象中的每个对象调用hashCode方法都必须产生相同的整数结果。
  • 如果两个对象根据等于(java.lang.Object)方法是不相等的,则不需要对每个对象调用hashCode方法就必须产生不同的整数结果。但是,程序员应该意识到,为不平等的对象生成不同的整数结果可能会提高哈希表的性能。

您必须确保当两个对象是equal()时,它们的hashCode()是相同的。IntelliJ通过在两个方法中使用相同的字段来确保这一点。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55421151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档