Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо
to the top

String Pool

25 Ноя 2025

Пул строк (String Pool) — структура данных в среде исполнения, содержащая объекты строк. Она позволяет избежать дополнительных выделений памяти при создании нового объекта строки. Пул строк существует благодаря их неизменяемости и механизму интернирования.

В языках C# и Java идея интернирования строк состоит в том, чтобы хранить в памяти только один экземпляр объекта типа String для всех идентичных строк. Если приложение работает с большим количеством повторяющихся строк, нет необходимости создавать новый объект String при появлении уже существующего значения. Вместо этого можно повторно использовать уже созданный экземпляр, обратившись к таблице интернирования.

Интернирование строковых литералов происходит автоматически. Вручную его можно выполнить с помощью метода intern.

Процесс создания строки с помощью литерала "hello" выглядит так:

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

Особенности сравнения строк в Java

Поскольку пул гарантирует, что строки с одинаковым содержимым имеют одинаковые ссылки, их можно сравнивать с помощью оператора ==:

String a = "hello";
String b = "hello";
System.out.println(a == b); // true

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

String a = new String("hello");
String b = "hello";
System.out.println(a == b); // false

Поэтому при сравнении строк в Java с помощью операции == следует проявлять осторожность. Строка, полученная из внешней библиотеки или иного места программы, может быть создана с помощью конструктора и не быть интернированной.

Если вы не можете гарантировать, находится ли строка в пуле, предпочтительнее использовать сравнение строк с помощью метода String.equals(). Он сравнивает внутреннее содержимое строк и не зависит от пула строк и механизма интернирования.

String a = new String("hello");
String b = "hello";
System.out.println(a.equals(b)); // true
Популярные статьи по теме