为什么我们需要检查哈希码两次?

时间:2015-12-06 15:51:24

标签: java dictionary hashcode

这是HashMap.java(docjar)的代码。密钥的哈希值在第431行计算。这有助于在第432行获取索引i。该索引处的所有条目应具有相同的哈希值。为什么在440行再次检查哈希等式? (if (e.hash == hash )

private void putForCreate(K key, V value) {
  430           int hash = (key == null) ? 0 : hash(key.hashCode());
  431           int i = indexFor(hash, table.length);
  432   
  433           /**
  434            * Look for preexisting entry for key.  This will never happen for
  435            * clone or deserialize.  It will only happen for construction if the
  436            * input Map is a sorted map whose ordering is inconsistent w/ equals.
  437            */
  438           for (Entry<K,V> e = table[i]; e != null; e = e.next) {
  439               Object k;
  440               if (e.hash == hash &&
  441                   ((k = e.key) == key || (key != null && key.equals(k)))) {
  442                   e.value = value;
  443                   return;
  444               }
  445           }
  446   
  447           createEntry(hash, key, value, i);
  448       }

1 个答案:

答案 0 :(得分:4)

同一个桶可能包含其键具有不同哈希码的条目(因为桶索引i是通过对计算的哈希应用模table.length来确定的,因此不同的哈希码可以映射到相同的哈希码因此,第440行中的比较使您无需为没有相同哈希码的两个密钥调用equals,这通常比比较两个int更昂贵。