我要问的可能是一个愚蠢的问题,所以请原谅我。
所以它是这样的:
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
实例仅在方法返回后从方法的变量中引用,因此ArrayList
和Boss
实例均符合GC的条件。