Ответ
Метод String.intern() управляет пулом строк (String Pool) — специальной областью heap-памяти для хранения уникальных строковых литералов.
Принцип работы:
- При вызове
someString.intern()JVM проверяет, существует ли в пуле строка, равнаяsomeString(по значениюequals()). - Если строка найдена, возвращается ссылка на неё из пула.
- Если не найдена, строка
someStringдобавляется в пул, и возвращается ссылка на эту новую запись.
Пример:
String s1 = new String("hello"); // Создаётся в heap, вне пула
String s2 = s1.intern(); // Помещает "hello" в пул (или находит) и возвращает ссылку из пула
String s3 = "hello"; // Литерал — ссылка берётся из пула
System.out.println(s1 == s2); // false (s1 — отдельный объект в heap)
System.out.println(s2 == s3); // true (обе ссылки указывают на один объект в пуле)
Ключевые особенности и применение:
- Экономия памяти: Гарантирует, что идентичные строковые константы представлены одним объектом в памяти.
- Сравнение через
==: Интернированные строки можно безопасно сравнивать оператором==, а не толькоequals(). - Производительность: Частые вызовы
intern()могут стать "узким местом", так как пул требует синхронизации. Используйте осмотрительно. - Расположение пула: До Java 7 пул находился в области PermGen, с Java 7+ — в основной области heap.