在背包、队列和栈(基于数组)的实现中,有 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 即可,这将覆盖无用的引用并使系统可以在用例使用完被弹出的元素后回收它的内存。