Что представляет из себя пул строк в Java?

Apr 06, 2020 11:37


Как вы уже поняли из названия, пул строк в Java это группа строк, хранящаяся в динамически-распределяемой памяти, или памяти кучи (Java Heap Memory). Мы знаем, что строки в Java это особенный класс и мы можем создавать новые объекты String не только с помощью оператора new, но и просто передав их значение в двойных кавычках.



Пул строк в Java

На этой диаграмме показано, как пул строк использует пространство памяти кучи и что происходит, когда мы используем разные способы создания строк:



Пул строк необходим лишь потому, что строка в Java является неизменной. Это является реализацией концепции интернирования строк(данная концепция подразумевает хранение только одной копии каждого значения объекта String). Также пул строк может служить примером шаблона проектирования «Приспособленец»

Пул строк помогает сохранить много места для Java Runtime, но из-за него на создание строки требуется больше времени

Когда мы используем двойные кавычки для создания строки, сперва ищется строка с таким же значением в пуле строк и если находится, то нам возвращается просто ссылка на неё. В противном случае, новая строка создаётся в пуле и ссылка на неё опять же возвращается.

Если же мы используем оператор new, то мы заставляем класс String создавать в памяти кучи новый объект String. Мы можем использовать метод intern(), чтобы положить такую строку в пул или же передать ей ссылку на другой объект String с таким же значением, уже находящийся в пуле.

Вот пример, демонстрирующий работу пула строк в Java:



Программа выведет:

s1 == s2 :true
s1 == s3 :false

Сколько строк создастся в пуле?

Иногда в интервью задают вопросы о пуле строк. Например, сколько строк создаётся представленным ниже оператором:

String str = new String("Cat");

Этот оператор создаст одну или две строки. Если в пуле уже есть строковый литерал «Cat», то будет создана только одна строка. Если строкового литерала «Cat» в пуле нет, то он сперва будет создан в пуле, а затем в пространстве памяти кучи, то есть будут созданы два объекта String. Это наглядно видно на диаграмме в начале статьи.

Данная статья является вольным переводом с https://www.journaldev.com/797/what-is-java-string-pool

программирование, перевод, java

Previous post Next post
Up