﻿# String Pool

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

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

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

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

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

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

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

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

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

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

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

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

```cpp
String a = new String("hello");
String b = "hello";
System.out.println(a.equals(b)); // true
```