首先让我提出一个问题,即我正在学习编程/数据结构。是的,我知道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,即使它将重新分配索引。看起来我应该这样,但代码看起来多余。或者,如果我是正确的,是否有一个不那么冗余的方式来编码呢?我真的很感激不止一句话的答案,我对这个话题非常好奇。
答案 0 :(得分:10)
不,没有必要这样做。它对垃圾收集没有任何影响。在以下某种情况下,将变量设置为null
(就垃圾收集而言)非常重要:
我个人的经验是,这些情况相对较少 - 例如,实例变量通常在包含对象的整个生命周期中都很有用。包含一些不需要的变量的长时间运行方法通常通常分成多个方法,但情况并非总是如此。
重要的是要注意,你没有将对象设置为null
- 没有这样的概念。您只能将变量的值设置为null
。区分这些概念非常重要:
变量的值是从不一个对象 - 只有一个引用或一个原始值。可以把变量想象成一张纸 - 一张纸不能包含实际的房子(对象),但是你可以在纸上写下房子的地址(用于导航到对象的参考) )。
答案 1 :(得分:1)
不,您不需要将其设置为null
。你可以覆盖这个值。 JVM知道对象何时没有对它的引用。之后,当触发垃圾收集时,它会自动进行垃圾回收。
How garbage collection works is best explained in the official documentation
可以在SO post
上找到有资格进行垃圾收集的项目的答案