在HashMap的Node中存储哈希的目的是什么?

时间:2019-09-19 04:20:15

标签: java data-structures

static class Node implements Map.Entry {
      final int hash;
      final K key;
      V value;
      Node next;

}

在Java中HashMap的内部实现中,Node存储哈希。

为什么使用它?我认为没有必要。

2 个答案:

答案 0 :(得分:1)

我相信主要原因是要提高性能。对于某些对象,调用equals()可能会很昂贵。在Short-circuit evaluation的帮助下,如果哈希值不匹配,则jvm不必调用equals()

这是getNode的实现方式(在遍历存储桶以搜索节点时调用。

     if (first.hash == hash && 
         ((k = first.key) == key || (key != null && key.equals(k))))

//( Same HashCode AND ((Same Object reference of the Key) OR (equal method says True in Key Object) )

编辑:如@moreON所述,哈希也需要重新哈希

答案 1 :(得分:0)

对于典型的哈希表实现,在 hash 哈希表时(即,由于容量太满而通常更改其容量时),将再次需要哈希。由于密钥的哈希值无法更改,并且可能是一项昂贵的操作,因此明智的做法是减少它的存储时间,以减少这种偶尔但昂贵的操作所花费的时间。

使用this article的其他哈希映射实现将比现在更频繁地需要哈希,因此对于那些哈希而言,找到现有条目的哈希非常重要。我不确定Java哈希映射使用哪种冲突解决方案。

编辑:Andy K在回答中也不是很好的观点(我完全没想到)-在添加项目时,必须对键进行严格的相等比较-任何碰撞解决方案都将导致多个哈希冲突哈希图的大小比哈希函数的可能结果集小得多。使用预先计算的哈希可以在此处进行快速的不平等测试。