我所问的可能是一个愚蠢的问题所以请原谅我。 所以它是这样的:
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”,但我这样做是为了清楚我的问题)。在正常情况下,我会将它们标记为垃圾收集,通过执行此操作,但因为在这种情况下,我在List集合中添加了这些Boss对象,它们是否标记为GC?如果不是那么为什么? List集合如何在内部工作以保存每个添加的Object的引用,以避免垃圾回收?
[EDIT]
问题范围仅限于在for
循环中创建的各个Boss对象,考虑到此方法将List的引用返回给外部世界。
答案 0 :(得分:9)
Boss
将不会收集GarbageCollector
个对象,因为它们仍会在您发布的代码块中引用。 bossList
是ArrayList
,其内部数组为Object
,因此保留了对添加到其中的对象的引用。
在这种情况下,不仅会考虑您的参考情况,还会考虑所有相关对象的参考资料。
编辑:由于您在代码中返回List,因此在您的程序中不再引用该列表之前,不会将对象标记为垃圾回收。
答案 1 :(得分:5)
ArrayList内部有Object[] elementData
。将b
添加到已分配bossList
的{{1}} ArrayList时。因此,当您将elementData[0] = b
分配给null
时,b
的实例仍会从Boss
引用,并且无法进行GC操作。但是,由于elementData[0]
实例仅在方法返回后被引用,因此ArrayList
和ArrayList
实例都符合GC的条件。
答案 2 :(得分:3)
以下是您的代码真正发生的事情:
答案 3 :(得分:-1)
由于java是通过引用传递的,因此无论何时将b
添加到bossList
,bossList
都会开始引用b指向的内存位置。因此,当b
无效时,只有从b
到引用的链接被破坏。从而通过bossList
保持对象可访问。