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

最常见的实现是使用一个链表保存缓存数据,详细算法实现如下:

 

Java HashMap和ConcurrentHashMap

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.****.net/weixin_44460333/article/details/86770169