簡體   English   中英

ArrayList.clear()是否遞歸地使內部的所有對象無效?

[英]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();

clearFoo對象的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM