int [] arr1 = new int[]{4,6,3,2,7,8};
int [] arr2 = new int[]{6,7,5,3,2,9};
arr2 = arr1;
System.out.println(arr2[3]);  // 2   ( =arr1[3] )

Выход этого кода равен 2.

  • Так что именно здесь происходит?

  • Неужели arr1 и arr2 находятся в разных местах памяти, но arr2 указывает на значения arr1?

  • Что случилось с первоначальными значениями arr2?

  • Они все еще доступны или были удалены сборщиком мусора?

  • если они доступны, должен ли программист освободить память 2-го массива?

2
TheSaviour 29 Авг 2017 в 17:22

3 ответа

arr1 и arr2 оба являются ссылками .

Первоначально они относятся к разным массивам.

Когда вы пишете arr2 = arr1;, ничто не ссылается на второй массив в вашей программе, и поэтому он действительно подходит для сборки мусора.

4
Bathsheba 29 Авг 2017 в 14:25

Эти переменные содержат ссылки. Так:

arr2 = arr1;

Означает две вещи:

  • ссылка, указывающая на массив arr2 ... отбрасывается
  • переменная arr2 теперь содержит ту же ссылку, что и arr1

Другими словами: после этой строки «оставлен» только один массив. Таким образом, arr2 [3] относится к тому же слоту массива, что и arr1 [3].

Этот «потерянный» массив все еще существует. Но сборщик мусора признает, что он больше не «доступен». Это означает: если GC решит собрать мусор, этот потерянный массив будет собран. Но обратите внимание: тот факт, что объект подходит для сборки мусора, не означает, что он будет собран в ближайшее время. Решение о том, когда / когда collection произойдет, зависит от сборщика мусора.

2
GhostCat 29 Авг 2017 в 14:51

Прежде всего, ссылки на массивы ведут себя точно так же, как и любые другие ссылки на объекты здесь. Таким образом, ответы будут одинаковыми для любых типов объектов.

Неужели arr1 и arr2 находятся в разных местах памяти, но arr2 указывает на значения arr1?

Ссылки находятся в разных местах, но содержат один и тот же адрес, который изначально был только адресом arr1.

Что случилось с первоначальными значениями arr2?

Исходный массив arr2 оставлен без ссылок и теперь является кандидатом на сборку мусора. Вы никогда не знаете, когда он действительно собран, и у вас нет прямого контроля над этим процессом.

Они все еще доступны или были удалены сборщиком мусора?

Они больше не доступны, но не гарантируется, что они будут удалены немедленно. GC имеет собственные алгоритмы планирования таких удалений.

если они доступны, должен ли программист освободить память 2-го массива?

Нет, программисту не нужно ничего освобождать вручную. В редких случаях, например, когда вы знаете, что вам скоро понадобится много памяти, вы можете вызвать System.gc (), чтобы «попросить» сборщик мусора собрать мусор, но не существует гарантированного ограничения времени для его выполнения.

1
Nicko 29 Авг 2017 в 15:49