Что будет, если объявить в классе переменные, создать массив, добавить в него переменные, а после чего присвоить массиву null? Удалятся ли переменные? Аналогичный вопрос: каким образом добавляются переменные в массив?(копируются и ТД)?
Ответ
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]);
Выведет первый раз "Ку-ку" и "Ку-ку", а второй раз -- "Ку-ку" и "Кукареку": первый раз это будут ссылки на один и тот же объект, второй раз -- ссылки на два разных объекта.
Все объекты и переменные, ссылки на которые утеряны в процессе работы программы, должны снестись сборщиком мусора. Насколько я помню, его можно запросить самому, а не ждать большого количества времени. Systнem.gc() https://javarush.ru/groups/posts/917-sborka-musora
При присваивании null массиву, вы теряете ссылку на старый массив ваших элементов и если вы их нигде больше не используете(элементы), то они будут удалены сборщиком мусора, иначе будут жить. Если массив примитивов, то при изменении значения элемента, который вы достали из него, не поменяются. Если же это будут ссылочные элементы, то соответсвенно они изменятся.
Если создать в классе объектные переменные, а после добавить их в массив, то при обнулении массива, массив удалиться а объекты не удаляться т.к. переменные будут по прежнему ссылаться на них. После того, как на объект в котором объявлены переменные не останется ссылок переменные будут удалены вместе с объектом.
Если я вас правильно понял вы имели ввиду что-то вроде такого
private Object o1 = "O1";
private Object o2 = "O2";
private Object[] arr = {o1,o2};
...
arr = null;
А принудительно вызывать очистку мусора не рекомендуется. Если вы создаете массив объектов, то в массив объектов добавляются только ссылки на объекты в куче. Если создаете массив примитивов, то значения копируются в массив.
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Мне нужен полный доступ к прозрачной части, те
Изменил подпись APK c Android debug на свою и перестал получать рекламу от AdMob(Ошибка 3)
Совсем нет опыта JSДелаю супер простой калькулятор
у меня вопрос к знатокам :) Я пытаюсь сделать динамически генерируемое "дерево решений"Данные которые нужны хранятся в глобальной переменной