HashMap的实现是否将键值对存储在链表中

时间:2011-07-07 20:13:32

标签: java

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

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

  2. 当两个不同的对象存储在同一个存储桶中时,它如何检索对象?

  3. 谢谢!

3 个答案:

答案 0 :(得分:4)

http://en.wikipedia.org/wiki/Hash_table

的大量细节

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

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

更新:要专门回答你的Q,它会存储一个Entry,它引用了存储桶中的下一个项目(如果有的话)。如果存储桶中只有一个项目,则引用将为null:

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

答案 1 :(得分:3)

bucket数组的数据类型为Map.Entry。当多个条目属于同一个存储桶时,它们通过保存对下一个条目的引用而存储在概念上是单向链表中。只是'head'处的Entry位于数组内部。但是,永远不会使用java.util.LinkedList或某些实际的列表类。这些条目只是通过保持对其斗式伴侣的引用而形成一个列表。

如果存储桶中存在多个存储桶,则它会从实际位于Map.Entry[]中的那个开始,该列表是列表的头部,然后开始遍历并检查.equals(),直到找到匹配或下一个为空。

答案 2 :(得分:0)

最好的理解方法是跟踪来源

  • 在eclipse中如果已配置jdk点击ctrl+shift+T键入HashMapAbstractMap
  • AbstractMapHashMap

你只需要做一次!