← Назад к вопросам
Почему объекты в 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