Нет, не всегда. В Java строковые литералы, объявленные в коде, автоматически помещаются в String Pool — специальное хранилище для уникальных строк. При присваивании строкового литерала переменной ссылка указывает на объект из пула.
Можно ли быть уверенным, что строка всегда будет ссылаться на объект из String Pool при присваивании?
Нет, не всегда.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Нет, не всегда. В Java строковые литералы, объявленные в коде, автоматически помещаются в String Pool — специальное хранилище для уникальных строк. При присваивании строкового литерала переменной ссылка указывает на объект из пула.
Однако если строка создаётся динамически, например, с помощью оператора new String("...") или путём конкатенации, то она не обязательно будет ссылаться на объект из String Pool, а создаст новый объект в куче.
Чтобы явно поместить строку в пул, можно вызвать метод intern():
String s1 = new String("hello");
String s2 = s1.intern(); // s2 ссылается на строку из пула
Таким образом, только строковые литералы и строки, явно интернированные через intern(), гарантированно ссылаются на объекты из String Pool.