LinkedHashMap繼承自HashMap,除了具有HashMap的功能之外鞠眉,還維持了一個(gè)雙向鏈表用來(lái)按照插入或訪問(wèn)的順序記錄所有Entry逝钥。
1- LinkedHashMap繼承結(jié)構(gòu)
LikedHashMap繼承自HashMap臊旭,通過(guò)重寫HashMap中的多個(gè)方法來(lái)實(shí)現(xiàn)對(duì)LikedHashMap中雙向鏈表的插入和刪除,從而保證能按照元素插入或者訪問(wèn)順序迭代所有元素撒顿。
2- 構(gòu)造函數(shù)
accessOrder默認(rèn)為false,即為插入順序连茧,另外還需要提供initialCapacity核蘸、loadFactor用來(lái)初始化HashMap,當(dāng)然不指定則使用默認(rèn)值啸驯。
3- 順序遍歷的實(shí)現(xiàn)
最后插入或者最后訪問(wèn)的節(jié)點(diǎn)位于雙向鏈表的尾部客扎。
1. 雙向鏈表節(jié)點(diǎn)
保存雙向鏈表的head和tail節(jié)點(diǎn)
繼承自HashMap.Node,雙向鏈表節(jié)點(diǎn)罚斗。
雙向鏈表的尾部添加
雙向鏈表的取代已存節(jié)點(diǎn)的操作
2. 重寫HashMap中鉤子方法來(lái)實(shí)現(xiàn)順序迭代
普通節(jié)點(diǎn)的插入和替代
樹節(jié)點(diǎn)的插入和替代
刪除
訪問(wèn)順序的支持
afterNodeAccess(需要注意:將訪問(wèn)的節(jié)點(diǎn)移動(dòng)到鏈表的尾部)
重寫get方法以支持訪問(wèn)順序
LRU(刪除最近最少使用)緩存更新策略場(chǎng)景的支持
HashMapput方法會(huì)將evict參數(shù)設(shè)置為true徙鱼;removeEldestEntry方法默認(rèn)返回false,如果要實(shí)現(xiàn)LRU則需根據(jù)業(yè)務(wù)場(chǎng)景重寫此方法
4- 順序迭代器
基于LikedHashMap的雙向鏈表的迭代器實(shí)現(xiàn)针姿,實(shí)現(xiàn)比較簡(jiǎn)單
5- 利用LinkedHashMap實(shí)現(xiàn)LRU的簡(jiǎn)單例子
繼承LinkedHashMap然后重寫removeEldestEntry方法
測(cè)試main函數(shù)
輸出結(jié)果