LinkedHashMap學習筆記

2021-10-23 03:55:45 字數 1999 閱讀 8600

概述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提供乙個特殊的建構函式,實現了每次迭代返回最...