以下是代码
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的第一个元素的副本并丢弃列表,以便垃圾收集器可以收集它?
答案 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,只有对该对象的引用才能使列表保持活动状态。当然,只要列表还活着,它的所有元素都是活着的,但反过来却没有。