7

我看到了java hash map,clear方法,像这样:

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

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

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

4

2 回答 2

4

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

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

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

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

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

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

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

(我不认为这与transient修饰符有任何关系。在这种情况下,修饰符只是为了可读性。HashMap该类提供readObject并且writeObject使transient修饰符没有实际意义。)

于 2012-08-27T06:11:40.980 回答
2

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

于 2012-08-27T06:10:10.260 回答