无法理解java中HashMap的clear方法的实现



我看到了java哈希图,clear方法,如下所示:

public void clear() {
    modCount++;
    Entry[] tab = table;
    for (int i = 0; i < tab.length; i++)
        tab[i] = null;
    size = 0;
}

我不明白,为什么要拿新标签来清除。

为什么不使用表格来清除?

我不明白,为什么要清除新标签。

这不是一张新桌子。。。它只是一个局部变量。

我能想到三个可能的原因:

  • 可读性,正如@Bhesh Gurung所建议的。。。尽管这在这里几乎没有什么不同(IMO)。

  • 如果一个线程调用clear(),而另一个线程执行可能导致表扩展的更新,则它可能会(在一定程度上)减轻所造成的损害。但它肯定不能解决问题,所以我倾向于认为这是荒谬的。

  • 它可能会提高性能;例如,由于优化器知道局部变量tab中的引用不能改变,因此它可以更好地优化数组边界检查。

其中,我认为第三个原因是最合理的。

(我不认为这与transient修饰符有任何关系。在这种情况下,修饰符只是为了可读性。HashMap类提供了readObjectwriteObject,使transient修饰符变得无意义。)

这可能是因为table字段被声明为transient,所以它不是HashMap对象持久状态的一部分。table字段在像resize()这样的方法中被替换,这是不同步的,所以当迭代clear()方法调用中的所有条目时,可以从下面交换table字段。如果它首先引用table,并遍历该引用,我们可以保证,如果table字段发生变化,我们仍在遍历原始table

最新更新