Этот вопрос проверяет понимание механизма пула строк (String Pool) в Java и способов помещения строк в него, что важно для оптимизации памяти и сравнения строк.
String Pool (пул строк) — это специальная область памяти в куче (heap), где Java хранит уникальные литералы строк для оптимизации памяти и производительности. Когда вы создаёте строку с помощью литерала (например, "hello"), JVM автоматически помещает её в пул. Однако строки, созданные через конструктор new String("hello"), размещаются в обычной куче, даже если такое же значение уже есть в пуле.
Чтобы "вернуть" такую строку в String Pool, используется метод intern(), определённый в классе String. Его работа:
После вызова intern() можно безопасно сравнивать строки через == (сравнение ссылок), если известно, что обе строки были интернированы.
public class StringPoolExample {
public static void main(String[] args) {
// Создаём строку через new — она не в пуле
String str1 = new String("Java");
// Создаём строку-литерал — она в пуле
String str2 = "Java";
// Сравнение ссылок: false, потому что разные объекты
System.out.println(str1 == str2); // false
// Помещаем str1 в пул с помощью intern()
String str3 = str1.intern();
// Теперь str2 и str3 указывают на один объект в пуле
System.out.println(str2 == str3); // true
// Также можно проинтернировать сразу при создании
String str4 = new String("Pool").intern();
String str5 = "Pool";
System.out.println(str4 == str5); // true
}
}Интернирование строк полезно в сценариях, где много повторяющихся строковых значений, например, при обработке текстовых данных, парсинге CSV/JSON, или в кэшах. Оно уменьшает потребление памяти, но требует времени на поиск в пуле. Следует использовать осторожно, так как пул хранится в heap и не очищается сборщиком мусора (до Java 7 он был в PermGen, что могло вызывать утечки).
Вывод: Используйте intern() для явного помещения строк в String Pool, когда нужно оптимизировать память при большом количестве дублирующихся строк, и вы уверены в ограниченности их разнообразия. В большинстве обычных случаев достаточно литералов и сравнения через equals().