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...