Ответ
Для этого используется метод 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()осознанно, только когда доказана необходимость оптимизации памяти для часто повторяющихся строк.