public V get(Object key) {
if (key == null)
return getForNullKey();
int hash = hash(key.hashCode());
for (Entry<K,V> e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
return e.value;
}
return null;
}
我所知道的是,如果你想从HashMap
获取一个对象,首先它会根据哈希码/哈希值搜索哈希桶,然后遍历该哈希桶中的LinkedList
(假设diff对象具有相同的哈希码,因此在相同的哈希桶中。)
但是看了上面的代码之后,我无法理解何时迭代LinekedList(以及LinkedList在哪里)
答案 0 :(得分:22)
存储桶有效地链接列表。 table
数组是Entry
个元素的数组,每个Entry
都是一个链表,因为每个条目都知道列表中的下一个,直到你到达结尾时next
引用为null。您显示的for
循环遍历链接列表。
它不是LinkedList
中的java.util.LinkedList
- 它只是地图的单独(更简单)实现。
答案 1 :(得分:3)
它确实使用链表,但不使用java.util.LinkedList
类。
基本上e.next
是您正在寻找的东西。
每个条目都引用了桶中的下一个条目 - 它是一个链表实现。
答案 2 :(得分:2)
e.next
正是您正在寻找的。每个条目都引用桶中的下一个条目;这是一个链表实现。
答案 3 :(得分:0)
桶是链表。
table是一个数组,它存储数组元素的第一个条目(linkedlist)的地址
在表数组中的position0处,需要存储两个条目对象,然后table [0]将存储entry1(linkedlist)的地址,entry1将存储entry2的地址。 For循环有助于迭代这些入口对象
table[0] --> entry1 --> entry2 --> null // Hence output is entry2 of get().
但是自从Java 8以来世界已经发生了变化,因为树被用来存储入口对象。