我需要使用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]
答案 0 :(得分:4)
在您的示例中,您不应使用super.hashCode()
,因为它将称为Object
身份hashCode()
。这将破坏contract between hashCode()
and equals()
,根据Object.hashCode()
javadoc is
hashCode的一般约定为:
- 只要在Java应用程序执行期间在同一个对象上多次调用它,hashCode方法就必须始终返回相同的整数,前提是不修改该对象的equals比较中使用的信息。从应用程序的一次执行到同一应用程序的另一次执行,此整数不必保持一致。
- 如果根据equals(Object)方法两个对象相等,则在两个对象中的每个对象上调用hashCode方法必须产生相同的整数结果。
- 如果两个对象根据equals(java.lang.Object)方法不相等,则不需要在两个对象中的每个对象上调用hashCode方法必须产生不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同的整数结果可能会提高哈希表的性能。
您必须确保当两个对象为equal()
时,它们的hashCode()
是相同的。 IntelliJ通过在两种方法中使用相同的字段来确保这一点。