Читая о equals() и hashcode(), я узнал, что если два объекта равны, то их хэш-коды должны быть равны, но не наоборот.
Но приведенный ниже пример не отражает этого.
class Employee{
private String name;
Employee(String name){
this.name = name;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Employee other = (Employee) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
Теперь, если я создам два объекта Employee как
Employee e1 = new Employee("hi");
Employee e2 = new Employee("hi");
Если я это сделаю, e1.equals(e2)
, он вернет true, хотя их хэш-коды различаются, что видно из печати, e1.hashcode()
и e2.hashcode()
.
Кто-нибудь может мне объяснить?
equals
иhashCode
должен поддерживаться программистом; вы не переопределилиhashCode
так, чтобы он вел себя нужным образом. По умолчанию используется реализация вObject
, что приводит к хэш-коду идентификации. - person obataku   schedule 13.10.2012