缓存过期算法相关点

2019-03-22  本文已影响0人  君山茫茫云归处

常用缓存过期算法

LRU 最近最少使用

LRU缓存过期算法 最近最少使用的对象最先被删除

public void trimToSize(int maxSize) {
   while (true) {
       K key;
       V value;
       synchronized (this) {
           if (size < 0 || (map.isEmpty() && size != 0)) {
               throw new IllegalStateException(getClass().getName()
                       + ".sizeOf() is reporting inconsistent results!");
           }

           if (size <= maxSize || map.isEmpty()) {
               break;
           }

           Map.Entry<K, V> toEvict = map.entrySet().iterator().next();//删除第一个元素
           key = toEvict.getKey();
           value = toEvict.getValue();
           map.remove(key);
           size -= safeSizeOf(key, value);
           evictionCount++;
       }

       entryRemoved(true, key, value, null);
   }
}

LFU 最近访问频率最低

LFU缓存过期算法 最近访问频率最低的对象最先被删除

HashMap和LinkHashMap,ArrayMap,SpareArray的差异

HashMap

HashMap 在JDK1.8中,HashMap采用位桶+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树

如上面代码,equal比对的时候只关心a字段,而不进行b字段比对,如果不重写hashCode方法,那么默认的hashCode比对的是整体的obj,那么会导致hashCode不同,而找不到Entry对应的值

LinkHashMap

LinkHashMap 继承HashMap,但是保存Entry的时候,除了保存当前对象的引用外,还保存了其上一个元素before和下一个元素after的引用,从而在哈希表的基础上又构成了双向链接列表。

SpareArray

SpareArray 定义了2个数组,int[] mKeys和 Object[] mValues, mKeys中的数据为升序有序排列。还有兄弟类,例如LongSparesArray,不是SparesLongArray

ArrayMap

ArrayMap 实现 Map<K,V>接口,基于两个数组,一个int保存hashCode,一个为Obj保存key/value键值对。容量是上一个数组的两倍。

上一篇下一篇

猜你喜欢

热点阅读