Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про Java: Java, String Pool, new String, heap, intern

Можно ли создать строку вне String Pool и как это сделать?

Этот вопрос проверяет понимание работы со строками в Java, в частности, механизма String Pool и способов создания строковых объектов вне пула.

Короткий ответ

Да, строку можно создать вне String Pool. Основной способ — использовать оператор new, например, String s = new String("text"). Это создаст новый объект в куче (heap), даже если идентичная строка уже существует в пуле. Также строки, сформированные динамически (например, через конкатенацию или StringBuilder), изначально не попадают в пул, пока не будет явно вызван метод intern().

Длинный ответ

В Java строки (String) являются неизменяемыми объектами. Для оптимизации памяти и производительности JVM использует специальную область памяти, называемую String Pool (или пул строк). Когда строка создаётся с помощью литерала (например, String s = "hello"), JVM сначала проверяет наличие такой же строки в пуле. Если строка найдена, возвращается ссылка на существующий объект; если нет — создаётся новый объект в пуле. Это позволяет экономить память, избегая дублирования одинаковых строк.

Создание строки вне String Pool

Чтобы создать строковый объект вне пула, необходимо явно использовать конструктор класса String с оператором new. Например:

String str1 = new String("Java");
String str2 = new String("Java");

В этом случае каждый вызов new String(...) создаёт новый объект в куче (heap), даже если строка "Java" уже присутствует в String Pool. Таким образом, str1 == str2 вернёт false, потому что это ссылки на разные объекты в куче.

Динамическое формирование строк

Строки, созданные динамически (например, через конкатенацию или с использованием StringBuilder), также изначально находятся вне пула:

String dynamic = new StringBuilder("Hello").append(" World").toString();
// dynamic ссылается на новый объект в куче, не в пуле

Метод intern()

Любую строку можно поместить в String Pool, вызвав метод intern(). Этот метод проверяет наличие строки в пуле: если она уже есть, возвращается ссылка на неё; если нет — строка добавляется в пул, и возвращается ссылка на эту новую запись.

String pooled = dynamic.intern();
// Теперь pooled может ссылаться на строку в пуле

Использование intern() следует применять с осторожностью, так как пул хранится в памяти постоянно, и его неконтролируемое заполнение может привести к утечкам памяти.

Вывод: Создание строк вне String Pool полезно, когда необходимо гарантировать уникальность объекта в куче или избежать накладных расходов на проверку пула. Однако в большинстве случаев использование литералов или метода intern() для часто повторяющихся строк предпочтительнее, так как это экономит память.

Уровень

  • Рейтинг:

    3

  • Сложность:

    4

Навыки

  • Java

    Java

Ключевые слова

#Java

#String Pool

#new String

#heap

#intern

Подпишись на Java Developer в телеграм