Ответ
String Pool (пул строк) — это специальная область памяти внутри кучи (Heap), предназначенная для хранения уникальных литералов строк (String). Его основная цель — оптимизация памяти за счет предотвращения дублирования неизменяемых (immutable) строковых объектов.
Как строки попадают в пул:
- Автоматически — при использовании строковых литералов:
String s = "text"; - Явно — при вызове метода
intern():new String("text").intern();
Пример, демонстрирующий работу пула:
String literal1 = "java"; // Создается в String Pool
String literal2 = "java"; // Переиспользует объект из пула
String newString = new String("java"); // Создается новый объект в куче, ВНЕ пула
String interned = newString.intern(); // Помещает строку в пул (или находит существующую)
System.out.println(literal1 == literal2); // true (одна ссылка)
System.out.println(literal1 == newString); // false (разные объекты)
System.out.println(literal1 == interned); // true (теперь одна ссылка)
Важно: Начиная с Java 7, String Pool был перемещен из PermGen (Permanent Generation) в основную Heap-область, что позволило избежать ошибок OutOfMemoryError: PermGen space и упростить сборку мусора для строк.