Как принудительно поместить строку в пул строк (String Pool) в Java?

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

Ответ

Для этого используется метод String.intern().

Как это работает:

  • Метод intern() помещает строку в пул (хранящийся в heap, в области Metaspace) если её там ещё нет, и возвращает ссылку на строку из пула.
  • Если такая строка уже существует в пуле, возвращается ссылка на существующий объект.

Пример:

String s1 = new String("Hello"); // Создаётся в heap, вне пула
String s2 = s1.intern();         // "Hello" добавляется в пул (или находится там), s2 ссылается на объект в пуле
String s3 = "Hello";            // Литерал, ссылается на тот же объект в пуле

System.out.println(s1 == s2); // false (разные объекты в памяти)
System.out.println(s2 == s3); // true (один объект в пуле)

Когда использовать intern():

  • При работе с большим количеством повторяющихся строк, созданных динамически (например, при парсинге), чтобы снизить потребление памяти.

Риски и рекомендации:

  • Пул строк хранится в памяти JVM (Metaspace) и не собирается сборщиком мусора стандартным образом. Неконтролируемое использование может привести к утечке памяти.
  • В современных версиях Java (9+) пул строк по умолчанию хранится в heap и может собираться GC, но использование intern() всё равно требует осторожности.
  • Лучшая практика: Используйте intern() осознанно, только когда доказана необходимость оптимизации памяти для часто повторяющихся строк.