LinkedHashMap浅析

首先明确几点:java


  1. LinkedHashMap继承在HashMap,非线程安全的安全

  2. 数据存储是经过HashMap存储,自身经过链表存储ide

  3. LinkedHashMap中Entry继承自HashMap的Entry,扩展了两个字段:before和after:实现了数据的有序存储this

  4. LinkedHashMap中有一个字段accessOrder,默认是false:按照插入顺序排序,不然按照访问顺序排序,即LRU算spa

如今看下代码:线程

 @Override
    void init() {
        header = new Entry<>(-1, null, null, null);
        header.before = header.after = header;
    }

初始化:默认建立一个hash值为-1的Entry,befor和after都是自身引用
code

void createEntry(int hash, K key, V value, int bucketIndex) {
        HashMap.Entry<K,V> old = table[bucketIndex];
        Entry<K,V> e = new Entry<>(hash, key, value, old);
        table[bucketIndex] = e;
        e.addBefore(header);
        size++;
    }

建立新的Entry:在header以前插入排序

private void addBefore(Entry<K,V> existingEntry) {
            after  = existingEntry;
            before = existingEntry.before;
            before.after = this;
            after.before = this;
        }

看图简单理解下:继承






       void recordAccess(HashMap<K,V> m) {
            LinkedHashMap<K,V> lm = (LinkedHashMap<K,V>)m;
            if (lm.accessOrder) {
                lm.modCount++;
                remove();
                addBefore(lm.header);
            }
        }

这个方法会在HashMap的get和put方法调用,那它的做用是:根据accessOrder修改数据存储顺序rem



  • 若是是访问顺序,即accessOrder是true,那么先把本身从链表删除,而后添加到header以前,由此保证最新访问的在最前面

相关文章
相关标签/搜索