【问题标题】:Why does a HashTable store the hash value of the key in the table in javajava中为什么HashTable会存储表中key的hash值
【发布时间】:2012-10-18 19:23:40
【问题描述】:

我正在通过 Java 对哈希表的 put 方法的实现,并遇到了这个:

// 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 会存储键的哈希值并检查它?

【问题讨论】:

    标签: java hashtable hash-collision


    【解决方案1】:

    由于% tab.length 操作,同一个桶(tab)可以容纳具有不同哈希值的项目。首先检查哈希可能是一些性能优化,以避免在哈希不同时调用equals()

    举个例子:假设你有两个复杂的对象,使用昂贵的equals() 方法。一个对象的哈希值等于 1,而另一个对象的哈希值是 32。如果将两个对象都放在一个有 31 个桶的哈希表中,它们最终会在同一个桶中 (tab)。添加第二个(不同的对象)时,您必须确保它尚未在表中。您可以立即使用equals(),但这可能会更慢。相反,您首先比较哈希,如果没有必要,避免使用昂贵的equals()。在此示例中,哈希值不同(尽管位于同一个存储桶中),因此不需要 equals()

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2019-12-20
        • 2011-01-04
        • 1970-01-01
        • 2012-05-12
        • 1970-01-01
        • 2013-03-09
        • 1970-01-01
        • 2012-06-09
        • 2012-10-30
        相关资源
        最近更新 更多