Ответ
Метод equals() вернёт false, так как используется реализация по умолчанию из класса Object, которая сравнивает ссылки (адреса в памяти), а не содержимое объектов.
Пример, демонстрирующий проблему:
class Person {
private String name;
public Person(String name) { this.name = name; }
// Методы equals() и hashCode() НЕ переопределены
}
Person p1 = new Person("Alice");
Person p2 = new Person("Alice"); // Создаётся новый объект с теми же данными
System.out.println(p1.equals(p2)); // false — сравниваются ссылки p1 и p2
System.out.println(p1 == p2); // false — наглядно показывает разницу ссылок
Почему это важно и к каким последствиям приводит:
- Некорректная работа коллекций —
HashSet,HashMapи другие используютequals()иhashCode(). Без их переопределения два логически одинаковых объекта будут считаться разными. - Нарушение контракта — ожидаемое поведение
equals()— сравнение по значению. Его отсутствие вводит в заблуждение.
Решение: Всегда переопределяйте equals() (и hashCode() для согласованности) для классов-значений.
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return Objects.equals(name, person.name); // Сравнение по полям
}