我有一些Stack的pop方法的代码,我试图找出它如何避免游荡,同时仍然返回我们的索引当前指向的元素:
public String pop()
{ // Remove item from top of stack.
String item = a[--N];
a[N] = null; // Avoid loitering (see text).
if (N > 0 && N == a.length/4) resize(a.length/2);
return item;
}
根据我的理解,我们将String对象的引用项指向我们数组a的索引元素(我们从最后一个元素开始,使用它的当前大小N-1,因此减少)。然后,如果我们返回引用,为什么我们在这样做之前设置我们的引用指向null的索引元素?是不是让这个项目指向什么都没有,什么都不返回?
答案 0 :(得分:15)
只要可以访问对象,就不能对其进行垃圾回收。如果只是使用--N
更改索引但不使a[N]
无效,则将保留对该对象的引用,即使客户端代码不再引用该对象,也会阻止其进行垃圾回收。
这是您需要在Java中使变量无效的唯一情况之一。
您似乎也误解了引用的内容。 a[N]
包含指向内存中对象的值。写入String item = a[N]
时,将该值复制到变量item
。两个变量(item
和a[N]
)现在都指向同一个对象。然后当您编写a[N] = null
时,从数组中删除该引用,但item
仍然包含指向原始对象的值。
答案 1 :(得分:2)
此复制数组中的引用。它不引用数组成员。
String item = a[--N];
现在您有两个对同一对象的引用,一个在局部变量中,一个在数组中。这将删除数组中的副本:
a[N] = null; // Avoid loitering (see text).
如果没有从数组中删除它,那么将继续存在不必要的引用,防止垃圾回收。