HashMap在内部使用LinkedList。

2022-09-03 12:35:16
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;
}

我所知道的是,如果你想从中获取一个对象,首先它会根据哈希代码/哈希值搜索哈希桶,然后循环访问该哈希桶(假设diff对象具有相同的哈希代码,因此在同一哈希桶中)。HashMapLinkedList

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


答案 1

存储桶实际上是链表。数组是元素的数组,每个元素都是一个链接列表,因为每个条目都知道列表中的下一个条目,直到引用为 null 时到达末尾。您显示的循环将循环访问链接列表。tableEntryEntrynextfor

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


答案 2

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

基本上就是你要找的东西。每个条目都有对存储桶中下一个条目的引用 - 它是一个链接列表实现。e.next