Ответ
String Pool (пул строк) — это специальная область в Heap Memory (куче), предназначенная для хранения уникальных литералов строковых объектов. Это механизм оптимизации памяти, реализованный JVM.
Принцип работы:
- При создании строки через литерал (
String s = "text") JVM ищет строку с таким значением в пуле. - Если строка найдена, возвращается ссылка на существующий объект.
- Если не найдена — строка создаётся в пуле, и ссылка на неё возвращается.
- Строки, созданные через оператор
new, всегда размещаются в обычной куче, даже если их значение уже есть в пуле.
Пример, демонстрирующий разницу:
String literal1 = "Java"; // Помещается в String Pool
String literal2 = "Java"; // Берётся ссылка из пула
String newString = new String("Java"); // Создаётся новый объект в куче
System.out.println(literal1 == literal2); // true (одна и та же ссылка)
System.out.println(literal1 == newString); // false (разные объекты в памяти)
System.out.println(literal1.equals(newString)); // true (значения равны)
// Метод intern() добавляет строку в пул (если её там нет) и возвращает ссылку из пула
String internedString = newString.intern();
System.out.println(literal1 == internedString); // true
Практическое значение:
- Экономия памяти: Многократное использование одних и тех же строковых литералов.
- Ускорение сравнения: Быстрая проверка через
==для строк из пула (хотя для общего случая всегда следует использовать.equals()).