Всегда ли строки, созданные конкатенацией (+), попадают в String Pool в Java?

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

Ответ

Нет, не всегда. Автоматическое помещение в String Pool происходит только для константных выражений, вычисляемых на этапе компиляции.

Попадают в Pool (compile-time):

String s1 = "a" + "b";          // -> "ab" (в Pool)
String s2 = "Hello, " + "World!"; // -> "Hello, World!" (в Pool)
final String prefix = "ID-";
String s3 = prefix + "100";      // -> "ID-100" (в Pool, т.к. `prefix` — final)

НЕ попадают в Pool (runtime):

String a = "a";
String b = "b";
String s4 = a + b;               // Новый объект в куче
String s5 = s4 + "c";           // Новый объект в куче
String s6 = new String("ab");   // Новый объект в куче

Как явно поместить строку в Pool? Используйте метод intern(). Он добавляет строку в Pool, если её там нет, и возвращает ссылку на пуловый объект.

String runtimeStr = a + b;
String pooledStr = runtimeStr.intern(); // Теперь в Pool

Практическая рекомендация: Для эффективной конкатенации множества строк в цикле или при динамическом построении используйте StringBuilder или StringBuffer. Метод intern() применяйте осознанно, так как Pool имеет ограниченный размер, и неконтролируемое его использование может привести к утечкам памяти.