Назад к вопросам
Junior
117
questionbank

Что такое пул строк в Java?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Пул строк (String pool) — это особая область памяти в куче (heap) Java, где хранятся строковые литералы и интернированные строки. Его основная цель — экономия памяти за счет повторного использования одинаковых строковых значений.

Как это работает:

Когда создается строковый литерал (например, "hello"), JVM сначала проверяет, существует ли уже строка с таким же значением в пуле строк.

  • Если строка существует: JVM возвращает ссылку на уже существующий объект в пуле, вместо создания нового.
  • Если строка не существует: JVM создает новый объект String в пуле строк и возвращает на него ссылку.

Создание строк и пул:

  1. С помощью строкового литерала:
    // "hello" - это строковый литерал
    String s1 = "hello";
    String s2 = "hello";
    // s1 и s2 будут ссылаться на один и тот же объект в пуле строк
    
  2. С помощью конструктора new String():
    String s3 = new String("world");
    String s4 = new String("world");
    // s3 и s4 будут ссылаться на разные объекты в куче, даже если их значение одинаковое.
    // Строковый литерал "world" может находиться в пуле, но объекты s3 и s4 - вне его.
    
  3. Метод 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