对象引用和克隆如何在java中工作

时间:2010-01-21 05:57:27

标签: java

以下是代码

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

现在在不同类的某个地方我从这个arList

获取数据
CustomDo custDO= (CustomDO)arList.get(0);

只要custDO还活着,arList是否存活?如果是,将在下面的代码帮助

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

有没有更好的方法来保留arList的第一个元素的副本并丢弃列表,以便垃圾收集器可以收集它?

4 个答案:

答案 0 :(得分:3)

  

最好只保留arList的第一个元素的副本并丢弃该列表,以便垃圾收集器可以收集它吗?

您不必复制list元素。只要你有另一个引用它,它就不会被垃圾收集,即使你得到它的列表是。一旦删除对它的所有引用,列表将被垃圾收集。

Java中没有必要克隆任何东西只是为了确保对象不会消失。在Java中,对对象的引用始终有效。实时参考的数据无法生效。

如果您害怕引用同一对象的其他人可能会改变其内容(在其上调用某个setter)会给您带来麻烦(或者您希望拥有它),那么您只想复制(克隆)一个私人副本来改变它而不影响其他人。)

答案 1 :(得分:0)

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

您应该知道的另一件事是Collections clone()方法执行浅(平)副本。有时您需要有深层副本(以允许独立修改它们)

答案 2 :(得分:0)

只要您有权访问CustomDO custDO对象,就不会进行垃圾回收。如果没有引用列表,可以对列表进行垃圾回收。

答案 3 :(得分:0)

ArrayList是一个普通的Object,只有对该对象的引用才能使列表保持活动状态。当然,只要列表还活着,它的所有元素都是活着的,但反过来却没有。

相关问题