Когда вы пишете:
// Moved [] to make it more idiomatic
String[] sarr = {s1, s2, s3};
То, что копирует значения s1
, s2
и s3
(которые являются ссылками, не объектов) в массив. После выполнения инструкции переменные полностью не зависят от массива. Изменение значения любой из переменных s1
, s2
, s3
для ссылки на другую строку вообще не влияет на содержимое массива.
Это точно так же, как с другими заданиями, например,
string x = "hello";
string y = x;
x = null; // Doesn't affect y
и аргументы метода тоже.
Обратите внимание, что часть сбора мусора здесь - красная сельдь - хотя очевидно, что понимание этого важно для понимания сбора мусора, обратное неверно. Важно понимать, что:
- Значения
s1
, s2
и s3
и элементы массива являются ссылками , а не объектами.
- Значения копируются при создании массива, поэтому последующее изменение переменной не имеет значения
Теперь, чтобы продолжить пример, рассмотрим:
StringBuilder sb = new StringBuilder("Hello");
StringBuilder[] array = { sb };
sb.append(" world");
System.out.println(array[0]);
Это напечатает «Hello world», потому что здесь у нас есть только один StringBuilder
объект , к которому относятся и sb
и array[0]
. При изменении данных внутри этот объект (что не то же самое, что изменение sb
для ссылки на другой объект) делает изменение видимым, как бы вы к нему ни подходили. Это похоже на то, как я передаю адрес моего дома двум людям - если один из них раскрасит мой дом в красный цвет, другой тоже это увидит.