LinkedHashMap 是如何實現的

2022-05-26 11:18:08 字數 1514 閱讀 9892

linkedhash 底層基於 hashmap 實現並擴充套件了 hashmap.node 使其支援雙向鍊錶

示例**:

hashmaphashmap = new hashmap<>();

linkedhashmaplinkedhashmap = new linkedhashmap<>();

for (int i = 0; i < 10; i++)

system.out.println(hashmap);

system.out.println(linkedhashmap);

輸出:

可以注意到 hashmap 由於 hash 演算法的特性,遍歷輸出並不是順序。 linkedhashmap雖然實現基於 hashmap 由於內部維護了雙向鍊錶所以支援按照插入順序進行輸出。

示例**:

public static void main(string args) 

for (int i = 5; i >= 0; i--)

system.out.println(hashmap);

system.out.println(linkedhashmap);

}

輸出:

當某個元素被訪問後將此元素移動在鍊錶尾部,基於此特性我們可以實現 lru (least recently used) 即在記憶體快取或分布式快取中常見的清理策略。

基於 linkedhashmap 實現 lru 共有如下幾步

繼承 linkedhashmap 或包裝linedhashmap

設定 linkedhashmap 按照訪問排序

確定 lru 容器最大容量

重寫 removeeldestentry 方法保證容器長度固定

示例**:

public class lruextends linkedhashmapimplements map

@override

protected boolean removeeldestentry(entryeldest)

public static void main(string args)

system.out.println(lru);

lru.get("index-9");

lru.get("index-8");

lru.get("index-0");

system.out.println(lru);

lru.put("index-11", 11);

system.out.println(lru);

}}

輸出內容:

通過輸出可以看到根據 lru 思想移除掉了index-1,基於 linkedhashmap 的 lru 容器始終保持最大容量10

LinkedHashMap是如何組織資料的

linkedhashmap繼承自hashmap,底層仍然是陣列加鍊表,除了發生衝突後的單鏈表,它還維護了乙個鏈結所有元素的雙鏈表,這樣就能記錄元素的插入或者訪問順序了。所以linkedhashmap可以做到有序迭代,也可以作為lru演算法的基石。linkedentryheader static cl...

LinkedHashMap簡單解析

原始碼版本1.7 本文參考 1 內部結構 節點的結構 整體結構 插入過程 1 從table的角度看,新的entry需要插入到對應的bucket裡,當有雜湊衝突時,採用頭插法將新的entry插入到衝突鍊錶的頭部。2 從header的角度看,新的entry需要插入到雙向鍊錶的尾部。刪除過程 1 從tab...

LinkedHashMap學習筆記

概述linkedhashmap資料結構相比較於hashmap來說,新增了雙向指標,分別指向前乙個節點 before和後乙個節點 after,從而將所有的節點已鍊錶的形式串聯一起來 hashmap裡面的方法在linkedhashmap進行了重寫 void afternodeaccess nodep v...