Попадает ли результат конкатенации строк «ABCD» + «ABC» в String Pool в Java?

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

Ответ

Ответ зависит от контекста выполнения операции.

  1. Конкатенация на этапе компиляции (попадает в Pool): Если оба операнда — строковые литералы, компилятор выполнит конкатенацию и поместит результат в String Pool.

    String s = "ABCD" + "ABC"; // Компилятор создаст "ABCDABC" и поместит его в Pool
    System.out.println(s == "ABCDABC"); // true (ссылка на один объект из Pool)
  2. Конкатенация во время выполнения (НЕ попадает в Pool автоматически): Если хотя бы один операнд — переменная, конкатенация выполняется в runtime, создавая новый объект String в куче (heap).

    String a = "ABCD";
    String b = "ABC";
    String result = a + b; // Новый объект в куче, НЕ в String Pool
    System.out.println(result == "ABCDABC"); // false (разные объекты)
  3. Явное помещение в 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().