Особенности сравнения строк и работы String Pool в Java

Будут напечатаны true, false, true, true. Литералы разделяют интернированную строку, new создаёт новый объект, intern возвращает каноническую ссылку.

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

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

Будут напечатаны 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, а не проверка идентичности через ==.

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

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

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

Подробнее