Назад к вопросам
Junior
117
questionbank
Что такое пул строк в Java?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Пул строк (String pool) — это особая область памяти в куче (heap) Java, где хранятся строковые литералы и интернированные строки. Его основная цель — экономия памяти за счет повторного использования одинаковых строковых значений.
Как это работает:
Когда создается строковый литерал (например, "hello"), JVM сначала проверяет, существует ли уже строка с таким же значением в пуле строк.
- Если строка существует: JVM возвращает ссылку на уже существующий объект в пуле, вместо создания нового.
- Если строка не существует: JVM создает новый объект
Stringв пуле строк и возвращает на него ссылку.
Создание строк и пул:
- С помощью строкового литерала:
// "hello" - это строковый литерал String s1 = "hello"; String s2 = "hello"; // s1 и s2 будут ссылаться на один и тот же объект в пуле строк - С помощью конструктора
new String():String s3 = new String("world"); String s4 = new String("world"); // s3 и s4 будут ссылаться на разные объекты в куче, даже если их значение одинаковое. // Строковый литерал "world" может находиться в пуле, но объекты s3 и s4 - вне его. - Метод
intern():String s5 = new String("java"); // Метод intern() проверяет, есть ли строка с таким значением в пуле String s6 = s5.intern(); // Если есть, возвращает ссылку на объект из пула. // Если нет, добавляет текущую строку в пул и возвращает на нее ссылку.
Преимущества пула строк:
- Экономия памяти: Уменьшает количество дублирующих строковых объектов.
- Повышение производительности: Сравнение строк литералами (
==) может быть быстрее, чем сравнение объектовStringс помощьюequals(), если оба операнда ссылаются на один и тот же объект в пуле.
Важное замечание:
Сравнение строк оператором == проверяет, ссылаются ли две переменные на один и тот же объект в памяти. Для сравнения содержимого строк всегда используйте метод equals().
String str1 = "abc"; // В пуле
String str2 = "abc"; // В пуле, та же ссылка
String str3 = new String("abc"); // Вне пула
String str4 = str3.intern(); // В пуле, та же ссылка, что у str1 и str2
System.out.println(str1 == str2); // true
System.out.println(str1 == str3); // false
System.out.println(str1 == str4); // true
System.out.println(str1.equals(str3)); // true