Строки неизменны.Это означает, что их ценность никогда не меняется.Их ссылки могут быть переназначены, что и происходит здесь.
Временная шкала в комментариях:
// Create two Strings. [string1]="abc", [string2]="def"
// Assign [string1] to arr[0].
// Assign [string2] to arr[1].
String[] arr={"abc","def"};
// Get value from arr[1] = [string2]
// Assign [string2] to s
String s=arr[1];
// Get value from arr[1] = [string2]
// create [string3] = "123r"
// create [string4] = [string2] + [string3]
// assign [string4] to arr[1]
arr[1]+="123r";
// get value from arr[0] = [string1]
// print [string1] = "abc"
// get value from arr[1] = [string4]
// print [string4] = "def123r"
for (String i:arr) {System.out.print(i);}
System.out.println(); // prints "abcdef123r"
// get value from s = [string2]
// print value "def"
System.out.println(s); //prints "def"
Я говорю "ссылка", поскольку из того, что я понимаю, Java передается по значению иссылка на память - это «значение»
Почти правильно.
Ссылка - это адрес.Значение можно найти в памяти по этому адресу.
Итак, что у вас есть:
Переменная = удобочитаемая.яблоко.
ссылка = адрес памяти.Считываемое компьютером.
значение = несколько байтов в памяти по заданному адресу.
Поэтому, когда вы делаете
String s = arr[1];
Вы назначаете адрес памяти, который был связан с переменной arr[1]
к переменной s
.Значение в ОЗУ остается неизменным и не изменяется.
Когда вы делаете
arr[1] += "123r";
Вы создаете целую новую строку.
Расширенное это то, что происходит шаг за шагом.
arr[1] += "123r";
arr[1] = arr[1] + "123r";
arr[1] = "def" + "123r";
arr[1] = "def123r";
Таким образом, arr[1]
присваивается адрес памяти / ссылка на результат операции после =
Это действие, однако, не имеет никакого отношения к переменной s
, так как эта переменнаясодержит адрес исходной строки, и нет кода для обновления этого адреса ссылки / памяти.