Удаление переменных [закрыт]

143
26 сентября 2019, 14:10

Что будет, если объявить в классе переменные, создать массив, добавить в него переменные, а после чего присвоить массиву null? Удалятся ли переменные? Аналогичный вопрос: каким образом добавляются переменные в массив?(копируются и ТД)?

Answer 1

Ответ

  1. Ответ на первую часть вопроса: с переменными ничего не будет, это никак на них не повлияет. Причина заключается в ответе на вторую часть вопроса.
  2. Ответ на вторую часть вопроса: Если массив описан как массив объектных типов (String, ArrayList и т. п.), то фактически в него помещается копия ссылки на объект, на который ссылается исходная переменная, т.е. фактически исходная переменная и элемент массива -- это ссылки на один и тот же экземпляр объекта. Из этого, в частности, следует, что 1) изменение такого объекта (например, добавление элемента в ArrayList) приведет к изменению состояния исходной переменной, и наоборот, 2) при этом уничтожение второй ссылки (например, отправкой в мусор всего массива) не повлечет уничтожения первой ссылки. В случае примитивных типов в массив помещаются копии значений исходных переменных и последующие манипуляции с ними никак не влияют на исходные переменные.

Однако не забывайте, что операции, которые внешне похожи на изменение неизменяемых (immutable) объектных типов, таких как Sting или Double, например присваивание, фактически означает создание нового объекта и присваивание переменной или элементу массива ссылки на этот новый объект. Например, фрагмент

  String s = "Ку-ку";
  String[] strings = new String[10];
  strings[5] = s;
  System.out.println("s = " + s + ", strings[5] = " + strings[5]); 
  strings[5] = "Кукареку";
  System.out.println("s = " + s + ", strings[5] = " + strings[5]); 

Выведет первый раз "Ку-ку" и "Ку-ку", а второй раз -- "Ку-ку" и "Кукареку": первый раз это будут ссылки на один и тот же объект, второй раз -- ссылки на два разных объекта.

Answer 2

Все объекты и переменные, ссылки на которые утеряны в процессе работы программы, должны снестись сборщиком мусора. Насколько я помню, его можно запросить самому, а не ждать большого количества времени. Systнem.gc() https://javarush.ru/groups/posts/917-sborka-musora

Answer 3

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

Answer 4

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

Если я вас правильно понял вы имели ввиду что-то вроде такого

    private Object o1 = "O1";
    private Object o2 = "O2";
    private Object[] arr = {o1,o2};
...
    arr = null;

А принудительно вызывать очистку мусора не рекомендуется. Если вы создаете массив объектов, то в массив объектов добавляются только ссылки на объекты в куче. Если создаете массив примитивов, то значения копируются в массив.

READ ALSO
Как сделать полностью прозрачное окно с непрозрачной рамкой?

Как сделать полностью прозрачное окно с непрозрачной рамкой?

Мне нужен полный доступ к прозрачной части, те

126
Проблема с AdMob

Проблема с AdMob

Изменил подпись APK c Android debug на свою и перестал получать рекламу от AdMob(Ошибка 3)

152
Калькулятор на JS выдаёт NaN. Всего три действия

Калькулятор на JS выдаёт NaN. Всего три действия

Совсем нет опыта JSДелаю супер простой калькулятор

132
Может ли свойство объекта ссылаться на другое свойство этого объекта

Может ли свойство объекта ссылаться на другое свойство этого объекта

у меня вопрос к знатокам :) Я пытаюсь сделать динамически генерируемое "дерево решений"Данные которые нужны хранятся в глобальной переменной

146