Результаты по порядку: true, false, true, false. Литералы и константная конкатенация интернируются, а выражение с обычной переменной c вычисляется во время исполнения.
Сравнение строк в Java с учётом интернирования и конкатенации
Результаты по порядку: 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.