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

Mak*_*sim 1 java arraylist data-structures

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

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

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;
}
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 10

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

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

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

需要注意的是你没有设定一个很重要的目的,以null有没有这样的概念- .您只能将变量的值设置为null.区分这些概念非常重要:

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

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

  • 您以最容易理解的方式拥有真正的人才措辞概念. (2认同)
  • @Maksim:是的,在这种情况下你需要这样做. (2认同)