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. 每当缓存命中(即缓存数据被访问),则将数据移到链表头部;
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.****.net/weixin_44460333/article/details/86770169