Sobes.tech
Back to questions
Junior — Middle
57

Будет ли сохраняться объединённая строка 'ABCDABC' в пул строк после её создания путём конкатенации?

Answer from AI

sobes.tech AI

Что хотят услышать интервьюеры:

Нет, строка, полученная обычной конкатенацией во время выполнения, сама по себе не обязана попасть в пул строк. В пул автоматически попадают строковые литералы и строки, явно интернированные через intern(). Поэтому ABCDABC окажется в пуле только если это литерал в коде или после явного интернирования.

Определение:

String pool — это область, где JVM хранит строковые литералы и некоторые строки для повторного использования. Если строка создаётся через конкатенацию в рантайме, обычно получается новый объект String в heap, а не запись в пуле. Чтобы поместить такую строку в пул, нужно вызвать intern().

Пример использования:

public class Main {
    public static void main(String[] args) {
        String a = "ABC";
        String b = "D";
        String c = a + b + "ABC";   // строка создаётся во время выполнения

        System.out.println(c);              // ABCDABC
        System.out.println(c == "ABCDABC");  // false, если не intern()
        
        String d = c.intern();
        System.out.println(d == "ABCDABC");  // true
    }
}

Пояснение кода:

  1. "ABC" и "D" — литералы, они уже находятся в пуле строк.
  2. a + b + "ABC" выполняется во время работы программы и создаёт новый объект строки.
  3. Сравнение c == "ABCDABC" проверяет ссылку, а не содержимое, поэтому без intern() обычно будет false.
  4. c.intern() возвращает каноническую строку из пула; если такой строки ещё не было, JVM добавляет её туда.
  5. После intern() ссылка d указывает на пуловую строку, поэтому d == "ABCDABC" становится true.

Ключевые моменты:

  • Обычная конкатенация в рантайме не гарантирует попадание строки в пул.
  • В пул автоматически попадают строковые литералы.
  • Для помещения строки в пул используется intern().
  • == сравнивает ссылки, equals() — содержимое строки.
  • Если конкатенация выполнена компилятором на этапе компиляции, результат может быть сразу литералом в пуле.