2010-01-21 2 views
2

Ниже приведен кодКак ссылку на объект и клонирование работает в Java

ArrayList arList = someMethod();// returning ArrayList with customDO objects 

Сейчас где-то в другом классе я получаю данные из этого arList

CustomDo custDO= (CustomDO)arList.get(0); 

Будет arList в живых до тех пор, пока custDO жив? Если да, то будет ниже кусок коды помощи

CustomDO custDO = ((CustomDO)arList.get(0)).cloneMe(); 
// where cloneMe has defintion as return ((CustomDO)super.clone()); 
// CustomDo implements Cloneable 

Есть ли лучший способ сохранить копию только первый элемент arList и выбросьте список, так что он может быть собран сборщиком мусором?

ответ

3

Можно ли сохранить копию только первого элемента arList и отбросить список, чтобы его можно было собрать сборщиком мусора?

Вам не нужно делать копию элемента списка. Если у вас есть еще одна ссылка на него, это не будет сбор мусора, даже если список, из которого вы его получили. И список будет собираться с мусором, как только вы удалите все ссылки на него.

В Java нет необходимости клонировать что угодно, чтобы убедиться, что объект не исчезает. В Java всегда ссылается на объект. Не может быть так, что данные для живой справки становятся недействительными.

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

+0

Я собираюсь удалить список из памяти и сохранить только первый элит. Как это можно достичь? –

+0

Нет проблем, просто делайте то, что вы делаете сейчас. Ваша ссылка custDo останется в силе, даже после того, как список будет удален. – Thilo

+1

Это не будет сбор мусора, пока нет ссылок на список. Установите любую ссылку на свой список на нуль или позвольте им исчезнуть, возвращаясь из метода, где объявлена ​​ссылка. Когда больше нет ссылок на список, тогда будет бесплатно собираться мусор. Ваш первый элемент останется в живых, потому что я предполагаю, что вы будете ссылаться на него. – rayd09

0
// reference to first object 
CustomDO custDO = ((CustomDO)arList.get(0)); 
// let arList be garbage collected 
arList = null; 

Другое дело, что вы должны знать, что методы Collections clone() выполняют мелкую (плоскую) копию. Иногда вам нужно иметь глубокие копии (чтобы их можно было модифицировать независимо)

0

Пока у вас есть доступ к объекту CustomDO custDO, это не будет сбор мусора. Список может содержать сбор мусора, если нет ссылки на него.

0

ArrayList - это обычный объект, и только ссылки на этот объект сохранят список в живых. Конечно, пока список жив, все его элементы также живы, но обратное не выполняется.

Смежные вопросы