Как работает метод String.intern() в Java?

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

Ответ

Метод String.intern() управляет пулом строк (String Pool) — специальной областью heap-памяти для хранения уникальных строковых литералов.

Принцип работы:

  1. При вызове someString.intern() JVM проверяет, существует ли в пуле строка, равная someString (по значению equals()).
  2. Если строка найдена, возвращается ссылка на неё из пула.
  3. Если не найдена, строка 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.