Java HashMap和ConcurrentHashMap

歸納下:

HashMap是底層由數組+鏈表組成的數據結構。非線程安全,resize併發可能形成環;

解決hash衝突的兩個方式:降低負載因子, 使用鏈表;

1.8:鏈表長度達到8,鏈表改爲紅黑樹。

 

ConcurrentHashMap:

1.7:使用Sement分段鎖

1.8:使用CAS+sychronized, 紅黑樹

 

可以結合LruCache看:內部可以用linkHashMap看

1.1. 原理

LRU(Least recently used,最近最少使用)算法根據數據的歷史訪問記錄來進行淘汰數據,其核心思想是“如果數據最近被訪問過,那麼將來被訪問的機率也更高”。

1.2. 實現

最常見的實現是使用一個鏈表保存緩存數據,詳細算法實現如下:

 

1. 新數據插入到鏈表頭部;

2. 每當緩存命中(即緩存數據被訪問),則將數據移到鏈表頭部;

3. 當鏈表滿的時候,將鏈表尾部的數據丟棄。

1.3. 分析

【命中率】

當存在熱點數據時,LRU的效率很好,但偶發性的、週期性的批量操作會導致LRU命中率急劇下降,緩存污染情況比較嚴重。

【複雜度】

實現簡單。

【代價】

命中時需要遍歷鏈表,找到命中的數據塊索引,然後需要將數據移到頭部。

核心操作的步驟:

  1. save(key, value),首先在 HashMap 找到 Key 對應的節點,如果節點存在,更新節點的值,並把這個節點移動隊頭。如果不存在,需要構造新的節點,並且嘗試把節點塞到隊頭,如果LRU空間不足,則通過 tail 淘汰掉隊尾的節點,同時在 HashMap 中移除 Key。
  2. 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章