有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

内存游荡和垃圾收集

我为堆栈的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;
}

据我所知,我们将字符串对象的引用项指向数组a的索引元素(我们从最后一个元素开始,使用它的当前大小N-1,因此减量)。那么,如果我们返回引用,为什么我们要在这样做之前将引用指向的索引元素设置为null?这难道不意味着该项目指向nothing并返回nothing吗


共 (2) 个答案

  1. # 1 楼答案

    只要对象是可访问的,就不能对其进行垃圾收集。如果您只是用 N更改索引,但不使a[N]为空,那么您将保留对该对象的引用,即使客户端代码不再引用该对象,也会阻止其垃圾回收

    这是Java中唯一需要将变量置零的情况之一

    你似乎也误解了什么是参考文献a[N]包含一个指向内存中对象的值。写入String item = a[N]时,将该值复制到变量item。两个变量(itema[N])现在都指向同一个对象。然后写入a[N] = null时,从数组中删除该引用,但item仍包含指向原始对象的值

  2. # 2 楼答案

    复制数组中的引用。它不引用数组成员

     String item = a[ N];
    

    现在有两个对同一对象的引用,一个在局部变量中,一个在数组中。这将删除阵列中的副本:

     a[N] = null; // Avoid loitering (see text).
    

    如果没有从数组中删除它,那么不必要的引用将继续存在,从而阻止垃圾收集