Пул строк (String Pool) — структура данных в среде исполнения, содержащая объекты строк. Она позволяет избежать дополнительных выделений памяти при создании нового объекта строки. Пул строк существует благодаря их неизменяемости и механизму интернирования.
В языках C# и Java идея интернирования строк состоит в том, чтобы хранить в памяти только один экземпляр объекта типа String для всех идентичных строк. Если приложение работает с большим количеством повторяющихся строк, нет необходимости создавать новый объект String при появлении уже существующего значения. Вместо этого можно повторно использовать уже созданный экземпляр, обратившись к таблице интернирования.
Интернирование строковых литералов происходит автоматически. Вручную его можно выполнить с помощью метода intern.
Процесс создания строки с помощью литерала "hello" выглядит так:
Поскольку пул гарантирует, что строки с одинаковым содержимым имеют одинаковые ссылки, их можно сравнивать с помощью оператора ==:
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
0