Есть ли у всех объектов в Java метод equals?

«Есть ли у всех объектов в Java метод equals?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, метод 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:

  1. Всегда переопределяйте hashCode вместе с equals (для корректной работы с HashMap, HashSet).
  2. Проверяйте на null и на совпадение типов (instanceof).
  3. Сравнивайте значимые поля объекта.
    @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);
    }