我读了一本书,其中提到当我们将元素放在HashMap中时,它在内部存储在存储桶中。我的问题是
hashmap是否以链表的形式存储键值对?或者只有在发生碰撞时才存储在链表中?
当两个不同的对象存储在同一个存储桶中时,它如何检索对象?
谢谢!
答案 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)