假设我有这样一堂课:
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吗?
不,但如果没有别的参考,他们将有资格进行垃圾收集.
例如,更简单的例子:
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).
| 归档时间: |
|
| 查看次数: |
443 次 |
| 最近记录: |