Ravi Gupta
Ravi Gupta

Reputation: 4574

How does object reference and cloning works in java

Below is the code

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

Now somewhere in different class I am getting data from this arList

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

Will the arList be alive as long as custDO is alive ? If yes, will below piece of code help

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

Is there a better way to keep a copy of only the first element of arList and discard the list so that it can be collected by garbage collector ?

Upvotes: 2

Views: 2762

Answers (4)

mfx
mfx

Reputation: 7408

The ArrayList is an ordinary Object, and only references to this object will keep the list alive. Of course, as long as the list is alive, all its elements are also alive, but the converse does not hold.

Upvotes: 0

fastcodejava
fastcodejava

Reputation: 41127

As long as you have access to CustomDO custDO object, it will not be garbage collected. The list can be garbage collected if there is no reference to it.

Upvotes: 0

stacker
stacker

Reputation: 69002

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

Another thing you should know is that Collections clone() methods do a shallow (flat) copy. Sometimes you need to have deep copies (to allow modifing them independedly)

Upvotes: 0

Thilo
Thilo

Reputation: 262842

Is there a better to keep a copy of only the first element of arList and discard the list so that it can be collected by garbage collector ?

You don't have to make a copy of the list element. As long as you have another reference to it, it will not be garbage-collected, even if the list you got it from is. And the list will be garbage-collected as soon as you remove all references to it.

There is no need in Java to clone anything just to make sure that the object does not disappear. In Java a reference to an object is always valid. It cannot happen that the data for a live reference gets invalid.

You only want to make a copy (clone) if you are afraid that other people who reference the same object might change its contents (calling some setter on it) in ways that would cause trouble for you (or you want to have a private copy to change it without affecting others).

Upvotes: 3

Related Questions