Как правильно сравнивать типы данных и объекты в Java?

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

Ответ

В Java сравнение зависит от типа данных и контекста:

1. Сравнение примитивов Используется оператор ==, который сравнивает значения:

int a = 10;
int b = 10;
System.out.println(a == b); // true

2. Сравнение объектов

  • == — сравнивает ссылки (адреса в памяти)
  • equals() — сравнивает содержимое объектов (требует переопределения)
String s1 = "hello";
String s2 = new String("hello");
String s3 = "hello";

System.out.println(s1 == s2);      // false — разные объекты
System.out.println(s1.equals(s2)); // true  — одинаковое содержимое
System.out.println(s1 == s3);      // true  — кэширование в String pool

3. Проверка типа объекта

  • instanceof — проверяет принадлежность к классу/интерфейсу (с учётом наследования)
  • getClass() — возвращает точный класс объекта
Object obj = "text";

// instanceof — проверяет иерархию
System.out.println(obj instanceof String);      // true
System.out.println(obj instanceof Object);      // true

// getClass() — точное сравнение классов
System.out.println(obj.getClass() == String.class); // true
System.out.println(obj.getClass() == Object.class); // false

4. Особенности Integer pool

Integer a = 127;
Integer b = 127;
Integer c = 128;
Integer d = 128;

System.out.println(a == b); // true  — значения из кэша (-128..127)
System.out.println(c == d); // false — новые объекты
System.out.println(c.equals(d)); // true — сравнение значений

Рекомендации:

  • Для объектов всегда используйте equals() вместо ==
  • Переопределяйте equals() и hashCode() согласованно
  • Для enum используйте == (гарантированно один экземпляр)