Что происходит при создании строковых переменных и сравнении их через оператор == в Java?
Что проверяют
Базовое понимание ссылочных типов: сравнение через == смотрит на ссылки, а не на текст. Для автоматизатора это ещё и про устойчивость проверок: почему сравнение строк зеленеет на выдуманных данных и падает на реальных.
Как отвечать
Строковый литерал попадает в пул строк, и два одинаковых литерала дают одну ссылку. Поэтому сравнение литералов через == возвращает true и создаёт ложное ощущение, что оператор работает по содержимому.
Вызов new String("Hello") всегда создаёт отдельный объект, поэтому ссылки разные, а текст одинаковый. То же самое со строкой, собранной во время работы: конкатенация переменных, чтение из файла, тело ответа сервиса, текст элемента на странице. Такая строка в пул не попадает, и == почти всегда даст false. Исключение это склейка двух литералов, её компилятор сворачивает заранее.
String a = "Hello";
String b = new String("Hello");
a == b; // false
a.equals(b); // true
a == b.intern(); // trueСравнивать содержимое: equals, без учёта регистра equalsIgnoreCase, устойчиво к null Objects.equals(a, b), для сортировки compareTo. В автотестах на JUnit или TestNG проверки строк и так идут через equals, но текст из интерфейса стоит нормализовать: обрезать пробелы, привести регистр, вычистить неразрывные пробелы.
Где спотыкаются
Проверяют гипотезу на литералах, получают true и делают вывод, что со строками можно сравнивать ссылки. На данных из интерфейса или из ответа сервиса тот же код молча даёт false, и дефект всплывает в редком сценарии, где его тяжело поймать.
Ловят NPE там, где его не ждали. Оператор == с null безопасен, а expected.equals(actual) падает, если слева оказался null. Значение, которое может отсутствовать, ставят аргументом, а не приёмником, либо берут Objects.equals.
Переносят вывод на обёртки чисел и забывают про кэш маленьких значений. Сравнение двух Integer со значением сто даёт true, а с тысячей уже false, хотя код тот же. На разобранных из ответа числовых полях это выглядит как плавающий тест.