假设我有一个类:
class C
{
int a, b;
ArrayList<int> c = new ArrayList();
};
还有这样一个集合:
ArrayList<ArrayList<C>> MyList = new ArrayList<ArrayList<C>>();
调用 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();
截至clear
,Foo
对象的dt
尚未被“nulled”或任何东西,但Foo
code> 对象以及仅它引用的事物(在本例中为其中的 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
)。
关于java - ArrayList.clear() 是否会递归地使所有对象无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24722198/