Java ArrayList.clear()是否以递归方式将内部的所有对象置零?

Java ArrayList.clear()是否以递归方式将内部的所有对象置零?,java,arraylist,Java,Arraylist,假设我有这样一门课: class C { int a, b; ArrayList<int> c = new ArrayList(); }; C类 { INTA,b; ArrayList c=新的ArrayList(); }; 以及这样一个集合: ArrayList<ArrayList<C>> MyList = new ArrayList<ArrayList<C>>(); ArrayList MyList=new Arr

假设我有这样一门课:

class C
{
   int a, b;
   ArrayList<int> c = new ArrayList();
};
C类
{
INTA,b;
ArrayList c=新的ArrayList();
};
以及这样一个集合:

ArrayList<ArrayList<C>> MyList = new ArrayList<ArrayList<C>>();
ArrayList MyList=new ArrayList();

调用MyList.clear()是否会使MyList中每个ArrayList的所有引用以及MyList中每个ArrayList中的任何其他对象的引用无效?因此,更准确地说,类C.C中的所有元素是否都会与C.a和C.b一样为空?

否,但如果没有其他元素引用它们,它们将有资格进行垃圾收集

例如,更简单的示例:

class Foo {
    Date dt;

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

ArrayList<Foo> list = new ArrayList<Foo>();
list.add(new Foo());
list.clear();

这里,
Foo
对象不符合垃圾收集的条件,因为
f
仍然引用它,即使列表没有引用它。当然,如果
f
是一个方法中的局部变量,那么只要该方法返回,
f
就超出范围-在这一点上,如果没有其他对象引用,它就符合GC的条件。但这不是重点,重点是当
清除
完成时,对象仍然被引用(通过
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();
ArrayList internal=new ArrayList();
添加(新的C());

ArrayList outer=new ArrayList查看这个线程——简单地说,Java为您自动执行指针过程。它在内存中创建一个变量,指向它,当您告诉它时,它会打断该指针,然后垃圾收集器会注意到没有对它的引用并将其吃掉。所以,当你清除一个数组时,你只是在破坏所有指向内存空间的指针。在垃圾被收集之前,它们仍然在那里,但没有任何东西指向它们。至少这是我的理解。嗯,关于你的第二个例子,如果f是一个局部变量,那么在离开局部空间后,它就不再引用对象了?然后它就可以进行垃圾收集了?@Savail:是的,一旦
f
超出范围,如果没有其他对象引用该
Foo
对象,该对象就可以进行垃圾收集了。
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();