← Назад к вопросам

Почему объекты в Java нельзя сравнивать через ==?

1.2 Junior🔥 161 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Почему нельзя сравнивать объекты через ==

Это одна из самых частых ошибок в Java. Суть проблемы в том, что == и equals() делают разные вещи:

Что делает оператор ==

Оператор == сравнивает ссылки на объекты (адреса в памяти), а не содержимое объектов.

String str1 = new String("Hello");
String str2 = new String("Hello");

System.out.println(str1 == str2);      // false — разные ссылки в памяти
System.out.println(str1.equals(str2)); // true — одинаковое содержимое

В примере выше оба объекта содержат одно и то же значение "Hello", но они находятся в разных местах памяти. Поэтому == вернет false.

Почему это происходит

В Java все объекты хранятся в heap-памяти, а переменные содержат только ссылку на объект (адрес в памяти). Оператор == для объектов просто сравнивает эти адреса.

Class Person {
    String name;
    int age;
}

Person person1 = new Person("John", 30);
Person person2 = new Person("John", 30);

System.out.println(person1 == person2);      // false — разные объекты в памяти
System.out.println(person1.equals(person2)); // false — equals() не переопределен

Правильный способ — переопределить equals()

class Person {
    String name;
    int age;

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;  // одна и та же ссылка
        if (obj == null || getClass() != obj.getClass()) return false;
        
        Person person = (Person) obj;
        return name.equals(person.name) && age == person.age;
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}

Person p1 = new Person("John", 30);
Person p2 = new Person("John", 30);

System.out.println(p1.equals(p2)); // true — логический эквивалент

Исключение: primitives и == для ссылок

Для примитивных типов == работает правильно:

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

Для ссылок == корректен только когда нужно проверить, это один и тот же объект:

String str1 = new String("test");
String str2 = str1;

System.out.println(str1 == str2); // true — одна и та же ссылка

Правило: всегда используй equals()

  • == — сравнение ссылок на объекты
  • equals() — сравнение содержимого объектов
  • Для безопасности используй Objects.equals() (обработает null):
Objects.equals(obj1, obj2); // не выбросит NPE если obj1 или obj2 == null
Почему объекты в Java нельзя сравнивать через ==? | PrepBro