Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Войти

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

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

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про Java: Java, String Pool, intern, string interning, memory optimization

Как вернуть строку обратно в String Pool?

Этот вопрос проверяет понимание механизма пула строк (String Pool) в Java и способов помещения строк в него, что важно для оптимизации памяти и сравнения строк.

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

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

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

String Pool (пул строк) — это специальная область памяти в куче (heap), где Java хранит уникальные литералы строк для оптимизации памяти и производительности. Когда вы создаёте строку с помощью литерала (например, "hello"), JVM автоматически помещает её в пул. Однако строки, созданные через конструктор new String("hello"), размещаются в обычной куче, даже если такое же значение уже есть в пуле.

Метод intern()

Чтобы "вернуть" такую строку в String Pool, используется метод intern(), определённый в классе String. Его работа:

  • Он проверяет, существует ли строка с таким же значением в пуле.
  • Если существует — возвращает ссылку на эту строку из пула.
  • Если не существует — добавляет текущую строку в пул и возвращает ссылку на неё.

После вызова intern() можно безопасно сравнивать строки через == (сравнение ссылок), если известно, что обе строки были интернированы.

Пример кода

public class StringPoolExample {
    public static void main(String[] args) {
        // Создаём строку через new — она не в пуле
        String str1 = new String("Java");
        // Создаём строку-литерал — она в пуле
        String str2 = "Java";
        
        // Сравнение ссылок: false, потому что разные объекты
        System.out.println(str1 == str2); // false
        
        // Помещаем str1 в пул с помощью intern()
        String str3 = str1.intern();
        
        // Теперь str2 и str3 указывают на один объект в пуле
        System.out.println(str2 == str3); // true
        
        // Также можно проинтернировать сразу при создании
        String str4 = new String("Pool").intern();
        String str5 = "Pool";
        System.out.println(str4 == str5); // true
    }
}

Где это применяется?

Интернирование строк полезно в сценариях, где много повторяющихся строковых значений, например, при обработке текстовых данных, парсинге CSV/JSON, или в кэшах. Оно уменьшает потребление памяти, но требует времени на поиск в пуле. Следует использовать осторожно, так как пул хранится в heap и не очищается сборщиком мусора (до Java 7 он был в PermGen, что могло вызывать утечки).

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

Уровень

  • Рейтинг:

    3

  • Сложность:

    4

Навыки

  • Java

    Java

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

#Java

#String Pool

#intern

#string interning

#memory optimization

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