Важно знать, как работает память на языках программирования.Переменная str не является строковым объектом, как вы могли бы подумать.Но вместо этого это ссылка на объект String с некоторым адресом.
Изменение того, на что указывает str , не изменяет строку, на которую оно указывает.На самом деле то, что происходит, выглядит примерно так:
У нас есть пул памяти, в нашем пуле три строки.У каждой строки есть адрес, который позволяет нам ее найти.
- Строка 1 - «Привет», адрес: 0x449345
- Строка 2 - «Там», Адрес: 0x058345
- Строка 3 - «Мир», адрес: 0x004934
У нас есть переменная, которая указывает на каждую переменную, мы будем называть их a, b и c.
Если бы мы сказали: System.out.println(a);
Java выдаст Hello
.Но a не является «Привет» .Вместо этого a - это то, что содержит 0x449345 .Затем компьютер говорит: «Хорошо, я возьму то, что находится в 0x449345 и распечатаю его».Когда он идет и смотрит на этот адрес, он находит строку «Hello».
Однако, если бы вы сказали: a = "NEW STRING";
a не будет указывать ни на один из наших предыдущих адресов.Вместо этого создается новый адрес, и "NEW STRING" помещается в эту область памяти.
Так же работает сборка мусора в Java.Как только вы установите значение «NEW STRING», оно больше не будет указывать на 0x449345, это говорит сборщику мусора, что этот объект безопасно удалить.Вот как ваша программа очищается после себя и не потребляет тонны оперативной памяти.
Из-за этого ссылка , указывающая на строку, не является поточно-ориентированной но фактический объект ЕСТЬ!Любой неизменный объект является безопасным с точки зрения безопасности, поскольку вы НЕ МОЖЕТЕ изменять этот объект вообще, вы можете изменять только то, на что указывает ваша переменная.Вы должны указать на другой объект, чтобы полностью «изменить» ваш неизменный объект.