是否有必要在重新分配时将过时的引用设置为null?

时间:2013-12-29 08:46:26

标签: java data-structures arraylist

首先让我提出一个问题,即我正在学习编程/数据结构。是的,我知道Java有一个集合API可以完成我正在编写的代码,但是目前我宁愿首先学习基本思想。

我正在编写一个ArrayList实现,并且在引用变得过时时对垃圾收集感到好奇。所以在我的情况下,我有一个通用的对象数组,即E[] data = (E[]) new Object[size];,并有一个方法E set(int index, E item),它将用项替换data[index]。这是我的方法体:

public E set(int index, E item) {
    if(index<0||index>size-1) throw new IndexOutOfBoundsException(); //Not relevant to question
    E previousValue = data[index];
    data[index]=null; 
    data[index]=item;
    return previousValue;
}

关于我的问题。是否有必要使对象为null,即使它将重新分配索引。看起来我应该这样,但代码看起来多余。或者,如果我是正确的,是否有一个不那么冗余的方式来编码呢?我真的很感激不止一句话的答案,我对这个话题非常好奇。

2 个答案:

答案 0 :(得分:10)

不,没有必要这样做。它对垃圾收集没有任何影响。在以下某种情况下,将变量设置为null(就垃圾收集而言)非常重要:

  • 这是长期运行方法中的局部变量
  • 这是一个静态变量
  • 它是一个实例变量,并且包含对象本身不符合垃圾回收的条件

我个人的经验是,这些情况相对较少 - 例如,实例变量通常在包含对象的整个生命周期中都很有用。包含一些不需要的变量的长时间运行方法通常通常分成多个方法,但情况并非总是如此。

重要的是要注意,你没有将对象设置为null - 没有这样的概念。您只能将变量的值设置为null。区分这些概念非常重要:

  • 变量(命名存储位置)
  • 引用(允许您“导航”到对象的值)
  • 物件

变量的值是从不一个对象 - 只有一个引用或一个原始值。可以把变量想象成一张纸 - 一张纸不能包含实际的房子(对象),但是你可以在纸上写下房子的地址(用于导航到对象的参考) )。

答案 1 :(得分:1)

不,您不需要将其设置为null。你可以覆盖这个值。 JVM知道对象何时没有对它的引用。之后,当触发垃圾收集时,它会自动进行垃圾回收。

How garbage collection works is best explained in the official documentation

可以在SO post

上找到有资格进行垃圾收集的项目的答案