Всем привет! Java String Pool — это специальная область хранения в куче Java, где хранятся строковые литералы. Это реализовано для повышения производительности строковых операций и экономии памяти. Он также известен как String Intern Pool или String Constant Pool.
Когда вы создаете новый строковый литерал из класса String, JVM сначала проверяет, существует ли строка уже в пуле строк. Если это так, JVM вернет ссылку на существующий строковый объект, а не создаст новый объект. Это известно как интернирование строк.
Например, рассмотрим следующий код:
В этом коде JVM создаст один строковый объект со значением “Harry Potter” и сохранит его в String Pool. И s1, и s3 будут ссылками на этот одиночный строковый объект. Если литерал отсутствует (“The Lord of the Rings”) , в String Pool появляется новый объект String.
Разбираем String Pool
Существует два способа создания строки на языке Java. Первый способ — использовать строковый литерал, а другой — ключевое слово new.
Теперь создадим еще два объекта String:
Это поможет понять в чем разница между ними. И сравним ссылки на строковые литералы:
Краткое напоминание! Когда вы сравниваете два объекта с помощью оператора ==, он сравнивает адреса в памяти.
Как Вы могли уже догадаться, всякий раз, когда мы используем новый оператор для создания строки, он создает новый строковый объект в куче Java и не проверяет, находится ли он в пуле строк или нет.
Метод String.intern()
Строковые литералы автоматически интернируются, то есть они сохраняются в пуле строк. Однако Вы также можете интернировать строки вручную, используя метод intern() класса String. Это полезно, если вы хотите гарантировать, что определенная строка хранится в пуле строк и может использоваться несколькими переменными или объектами.
Теперь мы можем увидеть это:
Как видите из картинки, теперь литералы s2 и s6 ссылаются на одну и ту же строку в String Pool.
Преимущества String Pool
- Поскольку JVM может возвращать ссылку на существующий строковый объект, а не создавать новый, операции со строками выполняются быстрее при использовании пула строк.
- Пул строк помогает экономить память, избегая создания ненужных строковых объектов.
- Пул строк позволяет разделять строки между различными переменными и объектами, что может быть полезно для уменьшения объема памяти вашей программы.
Недостатки String Pool
Использование String Pool может привезти к снижению производительности. Для получения строки из пула требуется поиск по всем строкам в пуле, что может быть медленнее, чем простое создание нового строкового объекта. Это особенно актуально, если программа создает и удаляет большое количество строк, поскольку в пуле строк необходимо будет выполнять поиск каждый раз, когда используется строка.
Некоторые примечания, которые следует запомнить
- Пул строк — это пример шаблона проектирования «Приспособленец»
- Все литеральные строки и константные выражения со строковыми значениями являются интернированными.
- До Java 7 JVM размещала пул строк в пространстве PermGen, которое имеет фиксированный размер — его нельзя расширить во время выполнения и он не подлежит сборке мусора. В связи с этим, мы могли получить ошибку OutOfMemory от JVM, если интернируем слишком много строк.
Пишите комментарии, оставляйте лайки и подписывайтесь, если Вам понравилась статья.
Источник: https://muratakkan.medium.com/understanding-and-using-the-java-string-pool-in-java-d60d3176716