【问题标题】:Is hashMap implemented as an array of linked listshashMap 是否实现为链表数组
【发布时间】:2013-08-23 19:53:32
【问题描述】:

在阅读HashMap 时,我看到它是作为存储桶数组实现的?现在这些桶总是链表吗?如果是,为什么叫桶而不叫链表?

【问题讨论】:

  • 这是什么编程语言?怀疑Java
  • 这种假设导致了著名的 DoS 攻击 (bugzilla.redhat.com/show_bug.cgi?id=750521)。回想起来,链表是桶实现的一个糟糕选择,但 Java 不会改变它。

标签: java hashmap


【解决方案1】:

查看HashMap的源代码告诉我们它是作为Entries数组实现的:

transient Entry[] table;

每个条目都有一个字段next,因此它们创建了一个单链表结构:

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

“桶”是一个更高级别的术语,在文献中和解释哈希映射时使用。这里的“桶”被实现为单链表。

【讨论】:

    【解决方案2】:

    在 Java 的 Hashmap 中,桶被实现为一个链表(每个 Entry 都引用另一个名为 next 的条目。

    术语“桶”是指一个概念。链表实现细节。

    【讨论】:

      【解决方案3】:

      Java 使用“分离链”的概念,将其实现为链表数组,以避免冲突。 但是,情况并非总是如此。一个 hashmap 可以完全实现为一个数组(线性探测);这虽然有更高的机会产生碰撞。

      关于“桶”的问题。你可以把链表想象成一个桶。但是,如果您的 HashMap 实现使用正确的 HashFunction(在 hashmap 数组中分配值的算法),那么您的“桶”最好只有一项。

      【讨论】:

        猜你喜欢
        • 2011-09-30
        • 2022-01-25
        • 1970-01-01
        • 2021-06-13
        • 2017-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多