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
}
}
Пояснение кода:
"ABC"и"D"— литералы, они уже находятся в пуле строк.a + b + "ABC"выполняется во время работы программы и создаёт новый объект строки.- Сравнение
c == "ABCDABC"проверяет ссылку, а не содержимое, поэтому безintern()обычно будетfalse. c.intern()возвращает каноническую строку из пула; если такой строки ещё не было, JVM добавляет её туда.- После
intern()ссылкаdуказывает на пуловую строку, поэтомуd == "ABCDABC"становитсяtrue.
Ключевые моменты:
- Обычная конкатенация в рантайме не гарантирует попадание строки в пул.
- В пул автоматически попадают строковые литералы.
- Для помещения строки в пул используется
intern(). ==сравнивает ссылки,equals()— содержимое строки.- Если конкатенация выполнена компилятором на этапе компиляции, результат может быть сразу литералом в пуле.