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