HashTable Collision它使用LinkedList存储多个具有相同键的值

时间:2012-12-08 16:03:52

标签: java hashtable

我多次读过一个哈希表,当碰撞出现时,一个键有多个值,它存储在一个链表中,然后它会调用等于调用哪些键映射到所需的值,但我看到哈希表的代码没有任何值put方法或get方法中的链表代码。它使用Entry []数组,我不明白它将如何用作链表。

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;
        }
    }

请引导并澄清我的怀疑。

1 个答案:

答案 0 :(得分:2)

我认为JVM之间的实现可能有所不同,但我使用了理解链表(但不一定是java.util.LinkedList)。这就是我在JVM中使用HashTable实现'put'的方式:

public Object put(Object key, Object value) {
    // Make sure the value is not null
    if (value == null) throw new NullPointerException();

    // Makes sure the key is not already in the hashtable.
    HashtableEntry e;
    HashtableEntry tab[] = table;
    int hash = key.hashCode();
    int index = (hash & 0x7FFFFFFF) % tab.length;

    for (e = tab[index] ; e != null ; e = e.next) {
        if ((e.hash == hash) && e.key.equals(key)) {
        Object old = e.value;
        e.value = value;
        return old;
        }
    }

这个版本和你发布的版本之间存在一些差异,但我认为它们背后的逻辑是相同的。 HashtableEntry看起来像这样:

class HashtableEntry {
    int hash;
    Object key;
    Object value;
    HashtableEntry next;
(...)

“HashtableEntry next”引用确实使HashtableEntry成为链表(链表是一种结构,其中每个元素都引用另一个相同类型的元素,除非它是列表中的最后一个元素)。 我认为你要找的是java.util.LinkedList,但HastTable以自己的方式实现了链表结构。