В чем разница между сравнением объектов через equals() и == в Java?

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

Ответ

В Java == и equals() выполняют принципиально разные виды сравнения.

Оператор/Метод Что сравнивает? Применение
== Ссылки в памяти (адреса объектов). Проверяет, указывают ли две переменные на один и тот же объект в куче.
equals() Логическое содержимое объектов. Проверяет, равны ли данные внутри объектов (по бизнес-логике).

Наглядный пример:

String a = new String("Java");
String b = new String("Java");
String c = a;

System.out.println(a == b);      // false! Разные объекты в памяти.
System.out.println(a.equals(b)); // true! Содержимое одинаковое ("Java").
System.out.println(a == c);      // true! c ссылается на тот же объект, что и a.

Ключевые правила для equals():

  1. Контракт с hashCode(): Если переопределяете equals(), всегда переопределяйте hashCode(). Объекты, которые equals() считает равными, должны возвращать одинаковый хэш-код.
  2. Поведение по умолчанию: В классе Object метод equals() также сравнивает ссылки (return (this == obj);). Его нужно переопределять для сравнения по значению.
  3. Для примитивов (int, char, boolean) используйте только ==.
  4. Для сравнения объектов используйте Objects.equals(a, b), который безопасно обрабатывает null.