LinkedHashMap原始碼理解

2021-10-06 02:04:18 字數 1670 閱讀 6260

public

class

linkedhashmap

extends

hashmap

implements

map }

transient linkedhashmapentry

head;

transient linkedhashmapentry

tail;

final

boolean accessorder;..

.}

linkedhashmap是hashmap的子類,只是增加了雙向鍊錶內容;

linkedhashmap是有序的,基於雙向鍊錶實現的;

提供了5種構造方法,accessorder屬性分為兩種:true-訪問順序,false-插入順序,不設定預設是false。

lru是基於linkedhashmap實現的,accessorder初始化為true,按訪問順序,即呼叫get(key)之後,將此entry插入到鍊錶尾部

linkedhashmap#get(key)

public v get

(object key)

linkedhashmap#afternodeaccess(e)

訪問後,將e插入到鍊錶尾部。

void

afternodeaccess

(node

e)// tail指向p節點

tail = p;

++modcount;

}}

put操作就是hashmap的put操作,linkedhashmap並沒有重寫此方法。

與hashmap不同點:

新節點產生;

put操作返回前,呼叫了重排序方法。

linkedhashmap重寫了newnode()方法,新點節點插入到鍊錶最後

node

newnode

(int hash, k key, v value, node

e)

private

void

linknodelast

(linkedhashmapentry

p)}

linkedhashmap#afternodeinsertion(evict)

根據上下文呼叫關係,這裡evict為true,此方式是判斷插入新的節點,是否需要刪除第乙個節點。

因為removeeldestentry()返回false,所以不會刪除任何節點。

void

afternodeinsertion

(boolean evict)

}

protected

boolean

removeeldestentry

(map.entry

eldest)

linkedhashmap是基於hashmap+雙向鍊錶實現的;

分為按訪問順序和插入順序兩種方式,lru是按訪問順序;

新節點處於鍊錶點尾部。

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