LinkedHashMap原始碼分析

2021-07-11 10:37:27 字數 1593 閱讀 9541

linkedhashmap繼承hashmap,所以hashmap是linkedhashmap的父類,hashmap有的方法linkedhashmap都有,linkedhashmap也會重寫某些方法,我們知道,hashmap底層資料結構是陣列和鍊錶,那麼linkedhashmap會額外維護乙個按照插入順序排序的雙向迴圈列表。

public linkedhashmap(int initialcapacity,

float loadfactor,

boolean accessorder)

這是linkedhashmap其中的乙個構造方法,這裡注意accessorder這個引數,預設為false,那就按照插入的順序排序,依靠那個雙向迴圈列表來實現,如果傳入accessorder為true時,那將按照lru演算法來實現。

void recordaccess(hashmapm) 

}

先來看這個重要的方法,這個方法是在**呼叫的呢,

public v get(object key)

public v put(k key, v value) 

}modcount++;

addentry(hash, key, value, i);

return null;

}

put方法沒有重寫,所以put方法還是用的父類hashmap的put()方法,說明在put和get時會呼叫recordaccess方法,就是在訪問元素時呼叫,我們接著看這個put方法,在裡面呼叫了addentry方法,所以linkedhashmap 重寫了addentry方法

void addentry(int hash, k key, v value, int bucketindex)  else 

}

void createentry(int hash, k key, v value, int bucketindex)
可以發現,addentry呼叫了createentry方法,這個就是加入元素的過程,顯然,這裡加入了兩次,在hash陣列中加入,還要addbefore,即在雙向迴圈列表中加入,加在頭結點之後,即元素末尾。接下來再來看這個方法:

void recordaccess(hashmapm) 

}

如果accessorder為true,呼叫remove移除這個entry,並且把這個加到雙向鍊錶的末尾,這樣就實現了lru。

再來看這幾行**:

entryeldest = header.after;

if (removeeldestentry(eldest)) else

protected boolean removeeldestentry(map.entryeldest)
預設是返回false,如果我們自己實現的話,可以通過重寫這個方法來設定刪除頭結點之後的元素,即最老元素。

看來,通過原始碼還是可以學習好多東西的。

AbstractCollection原始碼分析

abstractcollection抽象類提供了collection的骨架實現,collection分析請看 這裡直接看它的 是如何實現的.public abstract iterator iterator 該方法沒有實現.public abstract int size 該方法沒有實現.publi...

ThreadPoolExecutor原始碼閱讀

執行緒池解決兩個問題 一是復用執行緒,減少建立銷毀執行緒帶來系統開銷 二是限定系統資源使用邊界,避免大量執行緒消耗盡系統記憶體 適用於互不依賴,執行時間短,不需要對執行緒控制操作的執行緒 新增任務時,1.若執行緒數量小於corepoolsize,則新增執行緒執行任務 2.若執行緒數量大於等於core...

OrangePi One Android 原始碼編譯

一 系統環境搭建參照 二 lichee原始碼編譯 1.檢視help build.sh h2.配置核心 cd linux 3.4 make arch arm menuconfig 進入配置頁面,上下移動列表,空格是選擇列表,左右移動選擇退出選項 3.首次編譯執行清除 在 lichee linux3.4...