HashMap在内部使用LinkedList

时间:2013-04-02 15:59:15

标签: java hashmap

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在哪里)

4 个答案:

答案 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以来世界已经发生了变化,因为树被用来存储入口对象。