Hashtable底层持有者?

时间:2017-12-06 07:26:43

标签: data-structures hash hashtable

我正在尝试了解HashTable数据结构。我理解在HashTable中我们首先使用HashFunction来转换哈希代码的密钥,然后使用模运算符将Hash code转换为整数索引,并用于获取HashTable中的位置数据被放置。

在高水平,流程是这样的吗?

Key - > Hash Function - > Hash code - > Modulo operator - > integer index - > Store in HashTable

由于密钥是根据模运算符发出的索引存储的,我的疑问是,用于保存实际数据的底层数据结构是什么?它是一个数组,可以使用Index访问数组。

任何人都可以帮我理解这个吗?

1 个答案:

答案 0 :(得分:1)

虽然它完全取决于实现,但我同意底层数据结构是带有链表的数组,因为数组很容易以低成本访问元素,而链表是处理哈希冲突所必需的。

以下是java openjdk Hashtable中如何实施的详细示例 最初它创建具有初始容量的数组:

table = new Entry<?,?>[initialCapacity];

每次添加新元素时都会检查容量阈值。达到阈值限制时,它会执行rehashing并创建一个新数组,它是旧数组的双倍大小

    int newCapacity = (oldCapacity << 1) + 1;
    if (newCapacity - MAX_ARRAY_SIZE > 0) {
        if (oldCapacity == MAX_ARRAY_SIZE)
            // Keep running with MAX_ARRAY_SIZE buckets
            return;
        newCapacity = MAX_ARRAY_SIZE;
    }
    Entry<?,?>[] newMap = new Entry<?,?>[newCapacity];

    modCount++;
    threshold = (int)Math.min(newCapacity * loadFactor, MAX_ARRAY_SIZE + 1);
    table = newMap;

Hashtable Entry形成一个链接列表。它用于哈希冲突的情况,因为2个不同值的索引将变得相同,并且通过链表检查所需的值。

private static class Entry<K,V> implements Map.Entry<K,V> {
    final int hash;
    final K key;
    V value;
    Entry<K,V> next;

您可能需要检查Hashtables的other more simple实现,以便更好地理解。