All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.hutool.cache.impl.LRUCache Maven / Gradle / Ivy

Go to download

Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。

There is a newer version: 5.8.34
Show newest version
package cn.hutool.cache.impl;

import cn.hutool.core.lang.mutable.Mutable;
import cn.hutool.core.map.FixedLinkedHashMap;

import java.util.Iterator;

/**
 * LRU (least recently used)最近最久未使用缓存
* 根据使用时间来判定对象是否被持续缓存
* 当对象被访问时放入缓存,当缓存满了,最久未被使用的对象将被移除。
* 此缓存基于LinkedHashMap,因此当被缓存的对象每被访问一次,这个对象的key就到链表头部。
* 这个算法简单并且非常快,他比FIFO有一个显著优势是经常使用的对象不太可能被移除缓存。
* 缺点是当缓存满时,不能被很快的访问。 * @author Looly,jodd * * @param 键类型 * @param 值类型 */ public class LRUCache extends ReentrantCache { private static final long serialVersionUID = 1L; /** * 构造
* 默认无超时 * @param capacity 容量 */ public LRUCache(int capacity) { this(capacity, 0); } /** * 构造 * @param capacity 容量 * @param timeout 默认超时时间,单位:毫秒 */ public LRUCache(int capacity, long timeout) { if(Integer.MAX_VALUE == capacity) { capacity -= 1; } this.capacity = capacity; this.timeout = timeout; //链表key按照访问顺序排序,调用get方法后,会将这次访问的元素移至头部 final FixedLinkedHashMap, CacheObj> fixedLinkedHashMap = new FixedLinkedHashMap<>(capacity); fixedLinkedHashMap.setRemoveListener(entry -> { if(null != listener){ listener.onRemove(entry.getKey().get(), entry.getValue().getValue()); } }); cacheMap = fixedLinkedHashMap; } // ---------------------------------------------------------------- prune /** * 只清理超时对象,LRU的实现会交给{@code LinkedHashMap} */ @Override protected int pruneCache() { if (isPruneExpiredActive() == false) { return 0; } int count = 0; Iterator> values = cacheObjIter(); CacheObj co; while (values.hasNext()) { co = values.next(); if (co.isExpired()) { values.remove(); onRemove(co.key, co.obj); count++; } } return count; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy