Сравнение строк в Java с учётом интернирования и конкатенации

Результаты по порядку: true, false, true, false. Литералы и константная конкатенация интернируются, а выражение с обычной переменной c вычисляется во время исполнения.

Короткий ответ

Что ответить на собеседовании

Результаты по порядку: true, false, true, false. Литералы и константная конкатенация интернируются, а выражение с обычной переменной c вычисляется во время исполнения.

Подробный разбор

Ответ с пояснениями

Условие

Определите, какие из приведённых ниже сравнений строковых ссылок вернут true. При ответе учитывайте, как компилятор обрабатывает строковые литералы, механизм интернирования и особенности конкатенации строк в Java.

var a = "{ между скобок }";
final String b = "{ между ";
String c = "скобок }";
String d = "{ между скобок }";
String e = new String("{ между скобок }");

System.out.println(a == d);                    // №1
System.out.println(a == b + c);                // №2
System.out.println(a == b + "скобок }");      // №3
System.out.println(a == e);                    // №4

Для каждого сравнения объясните, почему полученный результат таков: является ли сравниваемый объект тем же самым объектом в пуле строк, создаётся ли новый объект в результате конкатенации, и как влияет оператор new на интернирование.

Ответ

Результаты по порядку: true, false, true, false. Литералы и константная конкатенация интернируются, а выражение с обычной переменной c вычисляется во время исполнения.

a и d указывают на один литерал. b — константная переменная, но c не final, поэтому b + c не является константным выражением и создаёт другую строку. b + литерал вычисляется как строковая константа. new String явно создаёт отдельный объект. Для сравнения содержимого здесь везде подошёл бы equals.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее