歸納下:
HashMap是底層由數組+鏈表組成的數據結構。非線程安全,resize併發可能形成環;
解決hash衝突的兩個方式:降低負載因子, 使用鏈表;
1.8:鏈表長度達到8,鏈表改爲紅黑樹。
ConcurrentHashMap:
1.7:使用Sement分段鎖
1.8:使用CAS+sychronized, 紅黑樹
可以結合LruCache看:內部可以用linkHashMap看
1.1. 原理
LRU(Least recently used,最近最少使用)算法根據數據的歷史訪問記錄來進行淘汰數據,其核心思想是“如果數據最近被訪問過,那麼將來被訪問的機率也更高”。
最常見的實現是使用一個鏈表保存緩存數據,詳細算法實現如下:
1. 新數據插入到鏈表頭部;
2. 每當緩存命中(即緩存數據被訪問),則將數據移到鏈表頭部;
3. 當鏈表滿的時候,將鏈表尾部的數據丟棄。
【命中率】
當存在熱點數據時,LRU的效率很好,但偶發性的、週期性的批量操作會導致LRU命中率急劇下降,緩存污染情況比較嚴重。
【複雜度】
實現簡單。
【代價】
命中時需要遍歷鏈表,找到命中的數據塊索引,然後需要將數據移到頭部。
核心操作的步驟:
- save(key, value),首先在 HashMap 找到 Key 對應的節點,如果節點存在,更新節點的值,並把這個節點移動隊頭。如果不存在,需要構造新的節點,並且嘗試把節點塞到隊頭,如果LRU空間不足,則通過 tail 淘汰掉隊尾的節點,同時在 HashMap 中移除 Key。
- get(key),通過 HashMap 找到 LRU 鏈表節點,因爲根據LRU 原理,這個節點是最新訪問的,所以要把節點插入到隊頭,然後返回緩存的值。
https://www.jianshu.com/p/74a4efacb0a7
https://www.cnblogs.com/Dhouse/p/8615481.html
參考:https://blog.csdn.net/weixin_44460333/article/details/86770169