Ответ
Да, метод equals есть у всех объектов, так как он объявлен в базовом классе java.lang.Object.
Ключевой момент: Поведение по умолчанию (унаследованное от Object) часто бесполезно для логического сравнения.
- Реализация
Object.equals(): Сравнивает ссылки (==), а не содержимое объектов. - Полезное сравнение: Требует переопределения (override) метода в своем классе.
Пример (поведение по умолчанию):
Object obj1 = new Object();
Object obj2 = new Object();
System.out.println(obj1.equals(obj2)); // false (сравниваются адреса в памяти)
System.out.println(obj1.equals(obj1)); // true (та же самая ссылка)
Пример (переопределенный метод, как в String):
String s1 = "hello";
String s2 = new String("hello"); // Разные объекты в памяти
System.out.println(s1.equals(s2)); // true! Метод переопределен для сравнения посимвольно.
Правила переопределения equals:
- Всегда переопределяйте
hashCodeвместе сequals(для корректной работы сHashMap,HashSet). - Проверяйте на
nullи на совпадение типов (instanceof). - Сравнивайте значимые поля объекта.
@Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return age == person.age && Objects.equals(name, person.name); }