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以前,由此保證最新訪問的在最前面

相關文章
相關標籤/搜索