Ответ
В Java == и equals() служат для сравнения, но делают это на разных уровнях абстракции.
-
Оператор
==(оператор равенства):- Для примитивных типов (
int,char,booleanи т.д.) сравнивает значения. - Для ссылочных типов (объекты) сравнивает ссылки, т.е. проверяет, указывают ли две переменные на один и тот же объект в памяти (на один адрес).
- Для примитивных типов (
-
Метод
equals():- Определен в классе
Objectи по умолчанию также сравнивает ссылки (его реализация по умолчанию:return (this == obj);). - Его основное предназначение — быть переопределенным (overridden) в пользовательских классах для сравнения объектов по их содержимому или бизнес-логике (например, два объекта
Personравны, если у них одинаковыйid). - Многие стандартные классы (
String,Integer,LocalDate) уже имеют корректно переопределенныйequals().
- Определен в классе
Наглядный пример:
String str1 = new String("Hello");
String str2 = new String("Hello");
String str3 = str1; // str3 ссылается на тот же объект, что и str1
System.out.println("str1 == str2: " + (str1 == str2)); // false (разные объекты в памяти)
System.out.println("str1.equals(str2): " + str1.equals(str2)); // true (одинаковое содержимое)
System.out.println("str1 == str3: " + (str1 == str3)); // true (одна и та же ссылка)
// Сравнение примитивов
int a = 5;
int b = 5;
System.out.println("a == b: " + (a == b)); // true (значения равны)
Критически важные нюансы для тестирования:
- Сравнение строк: Всегда используйте
"текст".equals(переменная). Это защищает отNullPointerException, еслипеременнаяравнаnull. Обратный порядок (переменная.equals("текст")) выбросит NPE. - Сравнение с
null: Для проверки наnullвсегда используйте==или!=. Выражениеobj.equals(null)либо вернетfalse(еслиequalsкорректно реализован), либо выбросит NPE. - Контракт
equals()иhashCode(): Если вы переопределяетеequals()в своем классе (например, в классе-модели для тестовых данных), вы обязаны переопределить иhashCode(), чтобы объекты, которые равны поequals(), имели одинаковый хэш-код. Нарушение этого контракта приведет к некорректной работе сHashSet,HashMapи другими коллекциями, основанными на хэше.