Java 对象游离
下面代码中 a[N] = null;
语句“避免对象游离”是什么意思?
public Item pop()
{
// 从栈顶删除元素
Item item = a[--N];
a[N] = null; // 避免对象游离
if (N > 0 && N == a.length/4) resize(a.length/2);
return item;
}
Java 的垃圾收集策略是回收所有无法被访问的对象的内存。在以上对 pop() 的实现中,被弹出的元素的引用仍然存在于数组中。这个元素实际上已经是一个孤儿了——它永远也不会再被访问了,但 Java 的垃圾收集器没法知道这一点,除非该引用被覆盖。即使用例已经不再需要这个元素了,数组中的引用仍然可以让它继续存在。这种情况(保存一个不需要的对象的引用)称为游离。所以需要将被弹出的数组元素的值设为 null 来避免游离,使系统可以在用例使用完被弹出的元素后回收它的内存。
总结自《算法(第四版)》1.3 背包、队列和栈