在一次采访中我被问到了一个有关垃圾收集的问题。
下面是一段代码。
List<String> a=new ArrayList<String>();
a.add("one");
a.add("two");
a.add("three");
a.add("four");
HashSet<String> h=new HashSet<String>();
h.add("four");
h.add("five");
h.add("six");
h.addAll(a);
a=null;
问题是:有多少对象符合垃圾回收的条件>
请解释一下。
最佳答案
本地范围内可见对象的一般答案:只有ArrayList
。 HashSet
可通过范围内局部变量 h
访问,并且字符串可通过 HashSet
访问。只有无法访问的对象才有资格进行垃圾回收。
注释:
字符串文字具体可以在字符串池中分配,如评论中所述。在这种情况下,这些对象将不符合垃圾回收的条件。
只能通过特殊类型的引用(例如弱引用)才能访问的对象可能仍然符合条件。
对整个事情持保留态度,因为这是一个理论面试问题,其主题在实践中很复杂。例如,您不知道在幕后分配了哪些其他对象。或者,如果可以证明没有其他用途,那么即使对象(从语言的角度)可访问,也可能存在积极的 GC 来收集对象。
关于Java : garbage collection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26114023/