В чём разница между оператором == и методом equals() в Java?

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

Ответ

== (оператор сравнения):

  • Для примитивных типов (int, char, boolean и др.) — сравнивает значения.
  • Для ссылочных типов (объекты) — сравнивает ссылки, т.е. проверяет, указывают ли две переменные на один и тот же объект в памяти (проверка идентичности).

equals() (метод):

  • Определён в классе Object. По умолчанию его реализация делает то же, что и == для объектов.
  • Предназначен для логического сравнения объектов по их содержимому (состоянию).
  • Должен быть переопределён в классах, где важна семантика равенства по значению (например, String, Integer, LocalDate).

Практический пример:

String s1 = new String("Java");
String s2 = new String("Java");
String s3 = s1;

System.out.println(s1 == s2);      // false — разные объекты в памяти
System.out.println(s1 == s3);      // true — одна и та же ссылка
System.out.println(s1.equals(s2)); // true — одинаковое содержимое ("Java")

int a = 5;
int b = 5;
System.out.println(a == b);        // true — сравнение значений примитивов

Правило: Для сравнения объектов всегда используйте equals(), если вам нужно сравнить их логическое состояние, а не идентичность в памяти. Для примитивов — только ==.