LinkedHashMap原始碼剖析

2021-10-05 16:30:05 字數 3497 閱讀 8452

0、簡介

​ 這篇又是乙個學了忘,忘了學的jdk原始碼,今天抽空整理下自己的學習記錄。linkedhashmap和hashmap相比是多了可以按照插入順序遍歷的功能,下面開始分析下其具體的實現。此次主要記錄以下幾個點。

​ 1、linkedhashmap使用示例

​ 2、linkedhashmap建構函式及屬性

​ 3、linkedhashmap核心方法分析

1、linkedhashmap使用示例

​ 下面使用linkedhashmap的特性來做個示例

2、linkedhashmap建構函式及屬性

類關係圖

建構函式

public

linkedhashmap()

public

linkedhashmap

(map<

?extendsk,

?extends

v> m)

public

linkedhashmap

(int initialcapacity,

float loadfactor,

boolean accessorder)

public

linkedhashmap

(int initialcapacity)

public

linkedhashmap

(int initialcapacity,

float loadfactor)

節點結構

// 這個是linkedhashmap每個元素的資料結構

static

class

entry

extends

hashmap.node

}

entry的繼承結構圖

由entry結構和before和after屬性可知,linkedhashmap節點之間有著雙向鍊錶的關係。

其他屬性

// 煉表頭引用

transient linkedhashmap.entry

head;

// 鍊錶尾部引用

transient linkedhashmap.entry

tail;

// 這個字段主要用來決定迭代順序的

// 若為true,迭代順序按照訪問順序排列(lru),最新的資料在鍊錶末尾

// 若為false,則按照插入的順序進行迭代訪問

final

boolean accessorder;

3、linkedhashmap核心方法分析

​ 下面我們分析下linkedhashmap如何維護鍊錶結構的,當我們呼叫put方法時候實際呼叫的是hashmap的put方法,但是table內部放的節點資料型別都是linkedhashmap內部的entry資料型別,且建立新節點時候呼叫的是linkedhashmap的newnode方法,下面就看看newnode的方法實現。

newnode

此方法是linkedhashmap中新增乙個新的節點時候維護鍊錶要做的操作。鍊錶一般是尾插法。

node

newnode

(int hash, k key, v value, node

e)// linknodelast實現

private

void

linknodelast

(linkedhashmap.entry

p)}

​ 下面我們再來看看獲取指定元素的方法有什麼小變化。

get(object key) 或者 getordefault(object key, v defaultvalue)

public v get

(object key)

void

afternodeaccess

(node

e) tail = p;

++modcount;

}}

​ 當呼叫linkedhashmap的remove()方法時候,其實是呼叫的hashmap的remove()方法,hashmap的remove()方法執行到最後會呼叫afternoderemoval(nodee)方法,這個方法是在linkedhashmap中實現的,主要就是鍊錶節點刪除,下面我們看看具體實現內容。

afternoderemoval(nodee)

void

afternoderemoval

(node

e)

​ 下面再來看看是如何獲取linkedhashmap的迭代器物件的實現

linkedhashmap.entryset().iterator()

// 獲取linkedhashmap的entryset

public set

>

entryset()

public

final iterator

>

iterator()

final

class

linkedentryiterator

extends

linkedha****erator

implements

iterator

>

}// linkedha****erator是linkedhashmap的內部類

// 構造時候讓它自己的next成員變數指向linkedhashmap所維護的鍊錶的頭引用

linkedha****erator()

// 當呼叫迭代器的next()方法實際是呼叫了下面這個方法

final linkedhashmap.entry

nextnode()

總結​ 以上就是本次學習linkedhashmap的全部記錄,linkedhashmap最大的特性就是可以按照鍵值對新增的順序遍歷,若有這個需求的地方使用linkedhashmap就很方便。

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