Junior — Middle
Kako su metoda equals i metoda hashCode povezane u Java ugovoru i zašto je to važno za ispravno funkcionisanje kolekcija?
sobes.tech АИ
Одговор од АИ
В Java существует важный контракт между методами equals и hashCode: если два объекта считаются равными методом equals, то у них должен быть одинаковый hashCode. Это правило необходимо для корректной работы коллекций, основанных на хешировании, таких как HashMap, HashSet.
Если нарушить этот контракт, например, два равных объекта имеют разные хеш-коды, то коллекции могут работать некорректно — объект может не найтись в хеш-таблице, даже если он там есть.
Пример:
class Person {
private String name;
private int id;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return id == person.id && name.equals(person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, id);
}
}
Здесь equals и hashCode согласованы: если два объекта Person равны, то и хеш-коды совпадут.