Ответ
Ответ зависит от контекста выполнения операции.
-
Конкатенация на этапе компиляции (попадает в Pool): Если оба операнда — строковые литералы, компилятор выполнит конкатенацию и поместит результат в String Pool.
String s = "ABCD" + "ABC"; // Компилятор создаст "ABCDABC" и поместит его в Pool System.out.println(s == "ABCDABC"); // true (ссылка на один объект из Pool) -
Конкатенация во время выполнения (НЕ попадает в Pool автоматически): Если хотя бы один операнд — переменная, конкатенация выполняется в runtime, создавая новый объект
Stringв куче (heap).String a = "ABCD"; String b = "ABC"; String result = a + b; // Новый объект в куче, НЕ в String Pool System.out.println(result == "ABCDABC"); // false (разные объекты) -
Явное помещение в Pool с помощью
intern(): Чтобы строку из кучи поместить в String Pool, необходимо вызвать методintern().String a = "ABCD"; String b = "ABC"; String result = (a + b).intern(); // Объект помещается в Pool (или возвращается ссылка на существующий) System.out.println(result == "ABCDABC"); // true
Итог: Строка "ABCDABC" попадёт в String Pool только если операция + вычисляется компилятором как константное выражение, либо если к результату runtime-конкатенации применить intern().