概述linkedhashmap資料結構相比較於hashmap來說,新增了雙向指標,分別指向前乙個節點——before和後乙個節點——after,從而將所有的節點已鍊錶的形式串聯一起來
//hashmap裡面的方法在linkedhashmap進行了重寫
void afternodeaccess(nodep)
void afternodeinsertion(boolean evict)
void afternoderemoval(nodep)
entry節點類static class entryextends hashmap.node
}
繼承hashmap的node節點增加了before和after兩個指標。
類屬性
// 用於指向雙向鍊錶的頭部
transient linkedhashmap.entryhead;
//用於指向雙向鍊錶的尾部
transient linkedhashmap.entrytail;
* 用來指定linkedhashmap的迭代順序,true則表示按照基於訪問的順序來排列,意思就是最近使用的entry,放在鍊錶的最末尾false則表示按照插入順序來
*/ final boolean accessorder;
構造方法
多了乙個 accessorder的引數,用來指定按照lru排列方式還是順序插入的排序方式。其他的hashmap一樣
public linkedhashmap(int initialcapacity,
float loadfactor,
boolean accessorder)
put方法// linkedhashmap 中重寫
nodenewnode(int hash, k key, v value, nodee)
// linkedhashmap 中實現
private void linknodelast(linkedhashmap.entryp)
}//linkedhashmap 中重寫
treenodenewtreenode(int hash, k key, v value, nodenext)
//插入後把最老的entry刪除,不過removeeldestentry總是返回false,所以不會刪除
void afternodeinsertion(boolean evict)
}protected boolean removeeldestentry(map.entryeldest)
通過重寫newnode建立了entry,在通過linknodelast 將entry放入鍊錶的尾部。實現了雙向鍊錶的建立
get方法
public v get(object key)
//此函式執行的效果就是將最近使用的node,放在鍊錶的最末尾
void afternodeaccess(nodee)
//將p設定為將p設定為尾節點
tail = p;
// 修改計數器+1
++modcount;
}}
如果鍊錶指標修改的話,其實在桶裡面的位置還是沒有改變的,只是前後指標改變了remove()
//呼叫的還是hashmap的。只不過從寫了afternoderemoval
void afternoderemoval(nodee)
總結
有序但是增加了時間和空間的開銷。節點增加了前後指標。迭代順序有兩種,插入順序和訪問順序,有著hashmap的所有功能。
LinkedHashMap簡單解析
原始碼版本1.7 本文參考 1 內部結構 節點的結構 整體結構 插入過程 1 從table的角度看,新的entry需要插入到對應的bucket裡,當有雜湊衝突時,採用頭插法將新的entry插入到衝突鍊錶的頭部。2 從header的角度看,新的entry需要插入到雙向鍊錶的尾部。刪除過程 1 從tab...
LinkedHashMap 實現總結
繼承於hashmap,定義了新的內部類entry用於實現雙向鍊錶儲存記錄的插入或訪問順序 accessorder用於指示鍊錶儲存記錄採用的順序,true為訪問順序,false為插入順序 加入新的記錄時需要更新鍊錶,訪問記錄時需要更新鍊錶 更具accessorder值判斷是否實際更新 removeel...
LinkedHashMap原始碼閱讀
linkedhashmap內部採用了雜湊表和煉表實現map介面,並可以保證迭代的順序,和hashmap不同,其內部維護乙個指向所有元素的雙向鍊錶,其決定了遍歷的順序,通常是元素插入的順序進行迭代,不過元素重新插入順序不會受到影響。linkedhashmap提供乙個特殊的建構函式,實現了每次迭代返回最...