簡體   English   中英

用超類hashCode和Object覆蓋hashCode

[英]Override hashCode with super class hashCode and Objects

我需要使用super.hashcode()來計算this.hashcode()嗎?

IDE(例如,IntelliJ Idea)可以生成等於和哈希碼。 它可以使用java.util.Objects 它還可以覆蓋super.hashcode()。

//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;
    }
}

現在,我們有兩個名稱相同的實例。 他們的hascode將有所不同。

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);
}

它輸出不同的哈希碼。

People are equal: true
Person 1: John, Hash code: -1231047653
Person 2: John, Hash code: -1127452445
People: [John, John]

在您的示例中,您不應該使用super.hashCode() ,因為它將調用Object標識hashCode() 這將破壞hashCode()equals()之間協定 ,根據Object.hashCode() javadoc

hashCode的一般約定為:

  • 只要在Java應用程序執行期間在同一對象上多次調用它,hashCode方法就必須始終返回相同的整數,前提是不修改該對象的equals比較中使用的信息。 從一個應用程序的執行到同一應用程序的另一執行,此整數不必保持一致。
  • 如果根據equals(Object)方法,兩個對象相等,則在兩個對象中的每個對象上調用hashCode方法必須產生相同的整數結果。
  • 根據equals(java.lang.Object)方法,如果兩個對象不相等,則不需要在兩個對象中的每個對象上調用hashCode方法必須產生不同的整數結果。 但是,程序員應該意識到,為不相等的對象生成不同的整數結果可能會提高哈希表的性能。

您必須確保當兩個對象equal()它們的hashCode()相同。 IntelliJ通過在兩種方法中使用相同的字段來確保這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM