Найти в Дзене
Bereshpolov

String Pool, оператор == vs equals()

Оглавление

Всем привет! Java String Pool — это специальная область хранения в куче Java, где хранятся строковые литералы. Это реализовано для повышения производительности строковых операций и экономии памяти. Он также известен как String Intern Pool или String Constant Pool.

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

Например, рассмотрим следующий код:

-2

В этом коде JVM создаст один строковый объект со значением “Harry Potter” и сохранит его в String Pool. И s1, и s3 будут ссылками на этот одиночный строковый объект. Если литерал отсутствует (“The Lord of the Rings”) , в String Pool появляется новый объект String.

Разбираем String Pool

Существует два способа создания строки на языке Java. Первый способ — использовать строковый литерал, а другой — ключевое слово new.

Теперь создадим еще два объекта String:

-3

Это поможет понять в чем разница между ними. И сравним ссылки на строковые литералы:

-4

Краткое напоминание! Когда вы сравниваете два объекта с помощью оператора ==, он сравнивает адреса в памяти.

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

Метод String.intern()

Строковые литералы автоматически интернируются, то есть они сохраняются в пуле строк. Однако Вы также можете интернировать строки вручную, используя метод intern() класса String. Это полезно, если вы хотите гарантировать, что определенная строка хранится в пуле строк и может использоваться несколькими переменными или объектами.

-5

Теперь мы можем увидеть это:

-6
-7

Как видите из картинки, теперь литералы 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