Будут напечатаны true, false, true, true. Литералы разделяют интернированную строку, new создаёт новый объект, intern возвращает каноническую ссылку.
Особенности сравнения строк и работы String Pool в Java
Будут напечатаны true, false, true, true. Литералы разделяют интернированную строку, new создаёт новый объект, intern возвращает каноническую ссылку.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Какие значения будут напечатаны при выполнении приведённого ниже кода, учитывая правила хранения и интернирования строк в Java?
public static void main(String[] args) {
String a = "aaa";
String b = "aaa";
String c = new String("aaa");
String d = new String("aaa").intern();
String e = String.valueOf("aaa");
System.out.println(a == b);
System.out.println(a == c);
System.out.println(a == d);
System.out.println(a == e);
}
Ответ
Будут напечатаны true, false, true, true. Литералы разделяют интернированную строку, new создаёт новый объект, intern возвращает каноническую ссылку.
D получает ту же ссылку, что a, благодаря явному intern. Для e вызывается String.valueOf(Object): аргумент уже String, чей toString возвращает этот же объект; дополнительная строка не создаётся. У c содержимое совпадает с a, но ссылка другая. Для прикладного сравнения значений нужен equals, а не проверка идентичности через ==.