Благодаря каким свойствам строк в Java возможна работа String Pool?

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

Ответ

String Pool (пул строк) в Java возможен благодаря фундаментальному свойству класса Stringиммутабельности (неизменяемости).

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

  1. При создании строки через литерал (String s = "text") JVM проверяет пул на наличие идентичной строки.
  2. Если строка найдена, возвращается ссылка на существующий объект.
  3. Если не найдена — строка создается и помещается в пул.

Ключевые свойства, делающие это безопасным и эффективным:

  • Immutable: Объект String нельзя изменить после создания. Разделение одной ссылки на строку между многими клиентами безопасно.
  • Интернирование: Метод intern() явно помещает строку в пул (или возвращает ссылку из него).
  • Кэширование хеш-кода: Хеш-код строки вычисляется один раз при первом вызове hashCode() и кэшируется. Это ускоряет поиск в хеш-таблицах, включая внутренние структуры пула.

Пример:

String literal1 = "hello"; // Создается в пуле
String literal2 = "hello"; // Берется ссылка из пула
String newString = new String("hello"); // Создается новый объект в куче
String internedString = newString.intern(); // Ссылка на объект из пула

System.out.println(literal1 == literal2); // true (один объект)
System.out.println(literal1 == newString); // false (разные объекты)
System.out.println(literal1 == internedString); // true