2012-10-18 180 views
6

我正想通过Java的实现了哈希表的put方法和遇到这样的:为什么哈希表店在Java中的表中的键的哈希值

// Makes sure the key is not already in the hashtable. 
    Entry tab[] = table; 
    int hash = key.hashCode(); 
    int index = (hash & 0x7FFFFFFF) % tab.length; 
    for (Entry<K,V> e = tab[index] ; e != null ; e = e.next) { 
     if ((e.hash == hash) && e.key.equals(key)) { 
      V old = e.value; 
      e.value = value; 
      return old; 
     } 
    } 

虽然我明白,一个关键需要检查冲突,为什么Java存储密钥的哈希值并检查它?

回答

8

由于% tab.length操作,同一个存储桶(tab)可以存放具有不同散列的项目。如果哈希值不同,则首先检查哈希可能会进行一些性能优化,以避免调用equals()

举一个例子:假设你有两个复杂的对象,其代价是equals()。一个对象的散列值等于1,而另一个对象的散列值为32.如果将这两个对象放在一个具有31个存储桶的散列表中,它们将最终在同一个存储桶中(tab)。添加第二个(不同的对象)时,您必须确保它尚未在表格中。您可以立即使用equals(),但这可能会变慢。相反,你首先比较散列,避免代价高昂的equals(),如果不是必要的话。在这个例子中哈希是不同的(尽管在同一个桶中),所以equals()是没有必要的。

1

它使访问速度更快,因为散列值不需要为每次访问重新计算。这不仅对于显式搜索(在执行equals之前检查哈希)而且对于重新哈希来说也很重要。