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