Гарантирует ли Java, что строковый литерал будет взят из String Pool?

«Гарантирует ли Java, что строковый литерал будет взят из String Pool?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, для строковых литералов — гарантировано. При использовании литералов Java помещает их в String Pool (heap) и возвращает ссылку на существующий объект при повторном использовании того же литерала.

Однако, это не гарантируется для строк, созданных:

  • Через конструктор new String().
  • Динамически (например, конкатенацией во время выполнения).

Пример:

String s1 = "hello";  // Гарантированно из пула
String s2 = "hello";  // Ссылка на тот же объект, что и s1
String s3 = new String("hello"); // Новый объект в куче, вне пула
String s4 = s3.intern(); // Помещаем значение в пул и получаем ссылку

System.out.println(s1 == s2); // true (одна ссылка)
System.out.println(s1 == s3); // false (разные объекты)
System.out.println(s1 == s4); // true (s4 теперь ссылается на объект из пула)

Практическое правило: Для гарантированного получения строки из пула используйте метод intern(), но учитывайте его потенциальные накладные расходы на производительность и память.