Ответ
String Pool (пул строк) в Java возможен благодаря фундаментальному свойству класса String — иммутабельности (неизменяемости).
Принцип работы:
- При создании строки через литерал (
String s = "text") JVM проверяет пул на наличие идентичной строки. - Если строка найдена, возвращается ссылка на существующий объект.
- Если не найдена — строка создается и помещается в пул.
Ключевые свойства, делающие это безопасным и эффективным:
- 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