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