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

时间:2012-08-27 05:58:10

标签: java hashmap

我看到了java哈希图,清晰的方法,如下:

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

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

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

2 个答案:

答案 0 :(得分:4)

  

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

这不是一个新表......它只是一个局部变量。

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

  • 可读性,正如@Bhesh Gurung所建议的那样......虽然这里几乎没有什么区别(IMO)。

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

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

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

(我认为这与transient修饰符无关。在这种情况下,修饰符仅用于提高可读性。HashMap类提供readObject和{ {1}}会导致writeObject修饰符无效。)

答案 1 :(得分:2)

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