LinkedHashMap浅析

首先明确几点:


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

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

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

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

现在看下代码:

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

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

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

看图简单理解下:



LinkedHashMap浅析_第1张图片




       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修改数据存储顺序



  • 如果是访问顺序,即accessOrder是true,那么先把自己从链表删除,然后添加到header之前,由此保证最新访问的在最前面




你可能感兴趣的:(LinkedHashMap浅析)