7

我要问的可能是一个愚蠢的问题,所以请原谅我。所以它是这样的:

List<Boss> bossList = new ArrayList<Boss>();
Boss b = null;
for(Employee e : List<Employee> myList){
    b = new Boss();
    b.setEmployee(e);
    bossList.add(b);
    b = null;
}

所以在上面的场景中,我创建了很多 Boss 对象,然后取消引用它们(我知道我不需要写“b = null”,但我这样做是为了清楚我的问题)。在正常情况下,我会通过这样做将它们标记为垃圾回收,但是因为在这种情况下,我将这些 Boss 对象添加到 List 集合中,它们是否标记为 GC?如果不是那为什么?List 收集如何在内部工作以保存每个添加的 Object 的引用,从而避免垃圾收集?

[EDIT] 

问题的范围仅限于在for循环中创建的单个 Boss 对象,考虑到此方法将 List 的引用返回给外界。

4

4 回答 4

10

Boss对象不会被收集,因为GarbageCollector它们仍然在您发布的代码块中被引用。bossList是一个ArrayList内部数组,Object因此包含对添加到其中的那些对象的引用。

在这种情况下,不仅会考虑您的引用,还会考虑所有涉及的对象中的所有引用。

编辑:由于您在代码中返回列表,因此在程序中不再引用该列表之前,不会将对象标记为垃圾回收。

于 2013-05-31T05:40:11.037 回答
5

ArrayListObject[] elementData内部有。当您添加bbossListArrayList 时分配elementData[0] = b. 所以当你分配nullb的实例时,Boss仍然是从中引用的elementData[0],不能被GCed。但是由于ArrayList实例仅在方法返回后才从方法的变量中引用,ArrayList并且Boss实例将有资格进行 GC。

于 2013-05-31T05:50:33.433 回答
3

这是您的代码实际发生的情况:

你好

于 2013-05-31T06:04:39.977 回答
-1

由于 java 是按引用传递的,因此无论何时添加bto bossList,都会bossList开始引用 b 指向的内存位置。因此,当b无效时,只有指向b引用的链接被破坏。从而保持对象可通过bossList.

于 2013-05-31T09:49:50.427 回答