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

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?如果没有,那为什么呢?列表收集在内部如何工作以保存每个添加的对象的引用,从而避免垃圾收集?
[EDIT]

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

最佳答案

ArrayList内部具有Object[] elementData。当您将b添加到bossList ArrayList中时,分配了elementData[0] = b。因此,当您将null分配给b时,仍然会从Boss引用elementData[0]实例,并且无法对其进行GC处理。但是由于ArrayList实例仅在方法返回后从方法的变量中引用,因此ArrayListBoss实例均符合GC的条件。

09-25 22:54