[英]Does ArrayList.clear() nullify all objects inside recurcively?
假設我有這樣的課程:
class C
{
int a, b;
ArrayList<int> c = new ArrayList();
};
這樣的集合:
ArrayList<ArrayList<C>> MyList = new ArrayList<ArrayList<C>>();
調用MyList.clear()會使對MyList中每個ArrayList的所有引用以及對MyList中每個ArrayList內的任何其他對象的引用都無效嗎? 因此,更准確地說,是否將Cc類中的所有元素以及Ca和Cb都作廢?
否,但是如果沒有其他參考,它們將有資格進行垃圾回收。
例如,更簡單的示例:
class Foo {
Date dt;
Foo() {
this.dt = new Date();
}
}
ArrayList<Foo> list = new ArrayList<Foo>();
list.add(new Foo());
list.clear();
clear
, Foo
對象的dt
尚未被“清空”或任何東西,但是Foo
對象及其僅引用的內容(在這種情況下為Date
)可以進行垃圾收集。
鑒於:
class Foo {
Date dt;
Foo() {
dt = new Date();
}
}
ArrayList<Foo> list = new ArrayList<Foo>();
Foo f = new Foo();
list.add(f);
list.clear();
在這里, Foo
對象不符合垃圾回收的條件,因為即使列表沒有, f
仍然引用它。 當然,如果f
是方法中的局部變量,則一旦該方法返回, f
就會超出范圍-此時,如果沒有其他對象對該對象的引用,則它有資格使用GC。 但這不是重點,重點是clear
完成后,仍將引用該對象(通過f
)。
如果c
是唯一包含對所包含列表的強引用的對象,則最終將對其進行垃圾回收。
它們不會直接清空,只是從包含列表中刪除。 例如
ArrayList<C> inner = new ArrayList<C>();
inner.add(new C());
ArrayList<ArrayList<C>> outer = new ArrayList<ArrayList<C>();
ArrayList<ArrayList<C>> outer2 = new ArrayList<ArrayList<C>();
outer.add(inner);
outer2.add(inner);
outer.clear();
在這種情況下, inner
將會被去掉outer
而不是從inner2
,並且以后還會有另一個強引用inner
,它不符合垃圾回收。 否則,它將被均勻釋放,但要立即全部釋放,而不是清空內部元素。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.