String — одна из тем, вызывающих затруднения. Это похоже на прогулку в «Bhool Bulaiya». Но когда вы посещаете «Bool Bhulaiya» с гидом, пути кажутся простыми, чтобы добраться до нужного пункта назначения, и это то, что мы попытались сделать в следующей статье, чтобы упростить путь к пониманию String.

Чтобы лучше понять, важно знать «Как», а не «Что». Итак, давайте начнем с рождения строки в утробе памяти.

РАСПРЕДЕЛЕНИЕ СТРОКОВОЙ ПАМЯТИ:

Строки могут быть объявлены следующим образом:
1: строка x = «Hello»;
2: строка y = новая строка («HowRU»);

Давайте посмотрим на распределение памяти в обоих случаях:

На приведенной выше диаграмме x — это переменная типа String, которая указывает на адрес, скажем, f0f0.
А адрес f0f0 — это адрес памяти в пуле строк, который теперь содержит литерал «Hello».

Обратите внимание: строковые литералы всегда сохраняются в специальной памяти, которая называется «пул строк».

Для String y =new String ("HowRU");
Как только определено ключевое слово "new", в динамической памяти создается объект с адресом очевидно, скажем a0a0.
Этот объект содержит адрес литерала «HowRU», который фактически сохраняется в пуле строк. Допустим, «HowRU» сохраняется по адресу f0f1 в пуле строк. (Как показано на рисунке).

Таким образом, следует запомнить следующее:
y указывает на объект с адресом a0a0
и a0a0 указывает на адрес в пуле строк (f0f1 )
и f0f1 содержит литерал «HowRU»
.

Теперь, когда понятно, как строки размещаются в памяти в зависимости от того, как они определены, мы можем перейти к самой интересной вещи о строках, НЕИЗМЕНИМОСТИ СТРООК.

В Java строки являются неизменяемыми, т. е. однажды созданные, они не могут быть изменены, но каждый раз при выполнении операции над string_literal создается новый литерал.

Кроме того, если двум переменным присвоен один и тот же string_literal, то в пуле строк присутствует только одна копия литерала, на которую указывают обе переменные.

Давайте разберемся на следующем примере.
Шаг 1:
Строка s1 = «Привет»;
Шаг 2:
s1 = s1 + «HowRU»;

На шаге 1 s1 назначается String_literal "Hello", который создается в пуле строк на адрес f0f0
На шаге 2 s1 объединяется с другой строкой «HowRU»

Но, как мы сказали выше, String является неизменяемым,после создания его нельзя изменить, но каждый раз, когда выполняется операция над строковым_литералом, создается новый литерал.

Таким образом, новая строка создается в пуле строк с адресом f0f1 и назначается s1.

Обратите внимание, что на шаге 2 "Hello" не перезаписывается "HelloHowRU". Но новая строка создается по новому адресу (f0f1) в пуле строк, и теперь s1 указывает на f0f1.

Это было базовое, но важное понимание того, как именно работают строки.
Поняв это, вы готовы взять более сложный пример (ссылка), который превратит строки из темы недоумения в забаву.