Почему два объекта с одинаковым hashCode могут иметь разные результаты при сравнении через equals?
Ответ от нейросети
sobes.tech AI
В Java метод hashCode() возвращает целочисленное значение, которое используется для быстрого поиска объектов в хэш-структурах, например, в HashMap или HashSet. Однако одинаковый hashCode не гарантирует, что объекты равны.
Причина в том, что hashCode — это всего лишь хэш-функция, которая может давать коллизии, то есть разные объекты могут иметь одинаковый хэш.
Метод equals() определяет фактическое равенство объектов по их содержимому или логике сравнения.
Таким образом, два объекта могут иметь одинаковый hashCode, но при сравнении через equals() вернуть false, если они отличаются по значимым полям.
Пример:
class Person {
String name;
int age;
@Override
public int hashCode() {
return 42; // намеренно простой хэш для примера
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Person)) return false;
Person p = (Person) o;
return age == p.age && name.equals(p.name);
}
}
Person p1 = new Person("Alice", 30);
Person p2 = new Person("Bob", 25);
System.out.println(p1.hashCode() == p2.hashCode()); // true
System.out.println(p1.equals(p2)); // false
Важно, чтобы при переопределении equals() всегда переопределять и hashCode() так, чтобы равные объекты имели одинаковый хэш, но обратное не обязательно.