【问题标题】:Does the implementation of HasMap store key-value pairs in a linked listHashMap的实现是否将键值对存储在链表中
【发布时间】:2011-09-30 18:53:58
【问题描述】:

我在一本书中读到,当我们将元素放入 HashMap 时,它在内部存储在存储桶中。我的问题是

  1. hashmap 是否完全以链表的形式存储键值对?还是只有在发生碰撞时才存储在链表中?

  2. 在同一个bucket中存储2个不同的对象时如何检索对象?

谢谢!

【问题讨论】:

标签: java


【解决方案1】:

bucket Array 的数据类型为Map.Entry。当多个条目落在同一个桶中时,它们通过保存对下一个条目的引用存储在概念上的单向链表中。只有“头部”的条目位于存储桶数组内。但是,从来没有使用过java.util.LinkedList 或一些实际的列表类。这些条目只是通过保存对它们的桶友的引用来形成一个列表。

当一个桶中有多个时,它从实际上在Map.Entry[]中的那个开始,它是列表的头部,然后开始遍历并检查.equals(),直到找到匹配或下一个空。

【讨论】:

    【解决方案2】:

    最好的理解方法是溯源

    • 在eclipse中如果配置jdk打ctrl+shift+T类型HashMapAbstractMap
    • AbstractMapHashMap

    你只需要做一次!

    【讨论】:

      【解决方案3】:

      http://en.wikipedia.org/wiki/Hash_table 有很多详细信息

      另见Internal implementation of java.util.HashMap and HashSet

      当然你也可以使用source,Luke。

      更新:为了专门回答您的问题,它存储了一个条目,其中包含对存储桶中下一个项目(如果有)的引用。如果桶中只有一项,则引用将为空:

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

      【讨论】:

      • 假设我只添加 1 个项目并将其添加到具有唯一哈希码的唯一存储桶中,那么在这种情况下,该存储桶如何存储键值对?它仍然以链表的形式存储还是如何存储?
      • 会有一个条目,包含键和值,但“下一个”变量将为空。这是一个只有一个条目的特殊情况的链接列表,即没有链接!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-26
      相关资源
      最近更新 更多