Java 使用超类hashCode和对象重写hashCode

Java 使用超类hashCode和对象重写hashCode,java,hashcode,Java,Hashcode,我是否需要使用super.hashcode()来计算this.hashcode() IDE(例如IntelliJ Idea)可以生成equals和hashcode。它可以使用java.util.Objects。它还可以重写super.hashcode() 现在让我们有两个同名的实例。他们的密码会有所不同 public static void main(String[] args) { Person person1 = new Person("John"); Person pers

我是否需要使用
super.hashcode()
来计算
this.hashcode()

IDE(例如IntelliJ Idea)可以生成equals和hashcode。它可以使用
java.util.Objects
。它还可以重写super.hashcode()

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

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

在您的示例中,您不应该使用
super.hashCode()
,因为它将调用
对象
identity
hashCode()
。这将打破

hashCode的总合同为:

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

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

在您的示例中,您不应该使用
super.hashCode()
,因为它将调用
对象
标识
hashCode()
。这将打破

hashCode的总合同为:

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

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

感谢您将链接装箱。IntelliJ通过在两种方法中使用相同的字段来确保这一点。-人是平等的,他们的哈希值是不平等的!IntelliJ 2018.3.5在生成
hashCode()
方法时不使用
super.hashCode()
。如果对象是
equal()
,但
hashCode()
不同于
hashCode()
实现中存在错误。它将破坏
HashMap
和依赖于
hashCode()
的其他结构。感谢您的binning链接。IntelliJ通过在两种方法中使用相同的字段来确保这一点。-人是平等的,他们的哈希值是不平等的!IntelliJ 2018.3.5在生成
hashCode()
方法时不使用
super.hashCode()
。如果对象是
equal()
,但
hashCode()
不同于
hashCode()
实现中存在错误。它将破坏
HashMap
和依赖于
hashCode()
的其他结构。
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]