java集合 LinkedHashMap 浅析

LinkedHashMap 是如何维持添加元素的顺序的?

使用双向链表来维持顺序.

/**
 * HashMap.Node subclass for normal LinkedHashMap entries.
 */
static class Entry<K,V> extends HashMap.Node<K,V> {
    Entry<K,V> before, after;
    Entry(int hash, K key, V value, Node<K,V> next) {
        super(hash, key, value, next);
    }
}

那么是在何时插入这个节点并保证其顺序的呢?


很容易想到应该是在 put 的时候:

我们在 put 方法中找到如下方法,

newNode(hash, key, value, null);

而这个方法在 LinkedHashMap 中被重写,

Node<K,V> newNode(int hash, K key, V value, Node<K,V> e) {
    LinkedHashMap.Entry<K,V> p =
        new LinkedHashMap.Entry<K,V>(hash, key, value, e);
    linkNodeLast(p);   // ------- 1
    return p;
}

我们看到, 在注释 1 处便把当前节点连接在链表的最后端, 从而维持有序, 跟进看看:

private void linkNodeLast(LinkedHashMap.Entry<K,V> p) {
    LinkedHashMap.Entry<K,V> last = tail;
    tail = p;
    if (last == null)
        head = p;
    else {
        p.before = last;
        last.after = p;
    }
}

过程很简单, 清晰明了.

你可能感兴趣的:(集合)