ArrayList.clear()是否会使recurcively内的所有对象无效?

Sav*_*ail 0 java arraylist

假设我有这样一堂课:

class C
{
   int a, b;
   ArrayList<int> c = new ArrayList();
};
Run Code Online (Sandbox Code Playgroud)

和这样的集合:

ArrayList<ArrayList<C>> MyList = new ArrayList<ArrayList<C>>();
Run Code Online (Sandbox Code Playgroud)

调用MyList.clear()会取消对MyList中每个ArrayList的所有引用以及MyList中每个ArrayList内的任何其他对象吗?那么,更准确地说,Cc类中的所有元素都将被取消以及Ca和Cb吗?

T.J*_*der 6

不,但如果没有别的参考,他们有资格进行垃圾收集.

例如,更简单的例子:

class Foo {
    Date dt;

    Foo() {
        this.dt = new Date();
    }
}

ArrayList<Foo> list = new ArrayList<Foo>();
list.add(new Foo());
list.clear();
Run Code Online (Sandbox Code Playgroud)

截至目前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();
Run Code Online (Sandbox Code Playgroud)

这里,该Foo对象符合垃圾收集的条件,因为f即使列表没有,它仍然引用它.当然,如果f是方法中的局部变量,那么只要方法返回,f就超出范围 - 此时,如果没有其他任何东西对该对象有引用,则它符合GC的条件.但是,除此之外,关键是当clear完成时,对象仍然被引用(by f).