Ответ
Нет, не всегда. Автоматическое помещение в 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 имеет ограниченный размер, и неконтролируемое его использование может привести к утечкам памяти.