15
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(假设差异对象具有相同的哈希码,因此在相同的哈希桶)。

但是在查看上面的代码之后,我无法理解它何时迭代 LinekedList(以及 LinkedList 在哪里)

4

4 回答 4

22

有效的链表。该table数组是一个Entry元素数组,每个元素Entry都是一个链表,因为每个条目都知道列表中的下一个元素,直到next引用为空时到达末尾。您显示的for循环遍历链表。

它不是 a LinkedList-java.util.LinkedList它是一个单独的(更简单的)实现,仅用于地图。

于 2013-04-02T16:02:07.297 回答
3

它确实使用链表,但不使用java.util.LinkedList类。

基本上e.next是您正在寻找的东西。每个条目都有一个对桶中下一个条目的引用——它是一个链表实现。

于 2013-04-02T16:04:26.743 回答
3

e.next就是你要找的。每个条目都有对桶中下一个条目的引用;这是一个链表实现。

于 2013-08-24T19:26:12.503 回答
0

桶是链表。
表是一个数组,它在数组的元素处存储第一个条目(链表)的地址。
说在表数组的位置0,需要存储两个条目对象,然后表[0]将存储条目1(链表)的地址,条目1将存储条目2的地址。For 循环有助于遍历这些入口对象。
table[0] --> entry1 --> entry2 --> null // Hence output is entry2 of get().

但是自从 Java 8 以来,世界发生了变化,因为树用于存储条目对象。

于 2018-03-29T13:35:27.210 回答