【源码学习】之LinkedHashMap

这篇讲LinkedHashMap很不错
LinkedHashMap之前,先说一点HashMap的原理,参考了这篇博文这是HashMap写数据的原理,为了减少冲突,hash算法是通过key的hashcode值与其hashcode右移16位后得到的值进行异或运算得到的。
在这里插入图片描述
LinkedHashMap可以说是HashMap和LinkedList的集合体,既使用了HashMap的数据结构,又借用了LinkedList双向链表的结构,基本数据类型还是Entry静态内部类。其结构如下,before、after指向保证顺序性,在同一个hash链表内部,使用next指向后一个节点。

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);
    }
}

当新建一个节点时,将新创建的节点p作为尾结点tail,当然如果存储的第一个节点,那么它既是head节点,也是tail节点,此时节点p的before和after都为null。否则,建立与上一次尾结点的链表关系,将当前尾节点p的前一个节点(before)设置为上一次的尾结点last,将上一次尾节点last的后一个节点(after)设置为当前尾结点p,通过此方法实现了双向链表功能,完成before,after,head,tail的值设置。LinkedHashMap中比较关键的一个方法:afterNodeAccess保证操作过的Node节点永远在最后,从而保证读取的顺序性,在调用put方法和get方法时都会用到。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/u010659877/article/details/108768325