Массивы в Java передаются по ссылке или по значению? - PullRequest
3 голосов
/ 04 февраля 2012

Находятся ли массивы в java по ссылке или по значению?(Я задавал подобные вопросы раньше, но ни один из них, похоже, не дал хорошего ответа, так что, надеюсь, на этот раз все будет иначе).

Предположим, у меня есть массив с именем data, который содержит объекты некоторого типа,Теперь давайте предположим, что я передал и сохранил этот массив в классе A, а затем передал его в класс B, а класс B изменил одну из записей массива.Изменится ли версия массива класса А?Имеет ли значение, если это был массив примитивов (например, int)?А как насчет ArrayLists?

Спасибо

Ответы [ 3 ]

8 голосов
/ 04 февраля 2012

Все в Java передается по значению. Однако, если вы передаете ссылку, это значение ссылки.

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

Теперь давайте посмотрим на некоторые эффекты.

Если я это сделаю:

Object[] o = ...
mutateArray(o);

содержимое впоследствии может быть другим, поскольку все, что нужно mutateArray, - это адрес массива, чтобы изменить его содержимое. Однако адрес o будет таким же. Если я сделаю:

String x = "foo";
tryToMutateString(x);

адрес x снова тот же после. Поскольку строки неизменяемы, это означает, что они также будут "foo".

Чтобы изменить объект, нужно изменить его содержимое (например, успешно изменить последний элемент o или попытаться изменить последнюю букву «foo» на «d»). Это не следует путать с переназначением x или o в стеке вызывающего абонента (невозможно).

Раздел Википедии о вызове с помощью общего доступа может пролить дополнительный свет.

0 голосов
/ 04 февраля 2012

Jist этого - все в Java передается по ссылке, если это не примитив.

0 голосов
/ 04 февраля 2012

Массивы, как и все другие объекты, передаются по ссылке (технически вы передаете ссылку по значению, но с точки зрения объектов, она передается по ссылке).Если вы передаете массив методу, а метод меняет массив, вызывающая сторона увидит изменения.Если вы хотите избежать изменения вашей копии, вам нужно скопировать ее самостоятельно.Не имеет значения, содержит ли массив примитивы или объекты.В общем, это именно то поведение, которое вам нужно, поскольку передача по значению потребует ненужного копирования (потенциально большого) массива каждый раз, когда вы используете его в качестве аргумента.

...