java实现LRU缓存
2022/1/26 9:04:14
本文主要是介绍java实现LRU缓存,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
LRU指的是最近不经常使用的。LRU缓存指的是当加入新元素时,如果缓存空间不够,需要清理掉原LRU中的一个元素,腾出位置放新元素。LRU缓存算法要求的是清除缓存中最近不使用的元素。这种实现机制可以使用LinkedHashMap来实现比较合适。但有一点需要注意,LinkedHash不是线程安全的,如果有多个线程需要写数据需要进行同步控制。如果需要增加线程同步功能,可以使用Collections工具。
通过阅读LinkedHashMap源码可以发现,LinkedHashMap有一个构造函数,构造函数可以接受三个参数,分别是默认初始容量,负载因子,是否按访问排序。
public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) { super(initialCapacity, loadFactor); this.accessOrder = accessOrder; }
定义LRU缓存实现类,继承LinkedHashMap类,在LRU的构造函数中调用LinkedHashMap的构造函数。在构造函数中定义一个初始容量(hashMap默认为16,这里需要根据实际业务量大小合理的设置,如果太大浪费空间,如果太小容易触发扩容,会有元素复制的开销),还要定义一个负载因子即当容量占用多大时触发HashMap扩容(默认0.45),accessOrder要设置为true(即将最近访问的元素放到链表的尾部)。此外,还需要复写boolean removeEldestEntry方法,自定义清除元素的条件(清除元素从列表头开始清理)。
package base.container; import java.util.LinkedHashMap; import java.util.Map; /* * LRU:最近最少使用 * 场景:假设缓存大小为10,现在缓存已经有是个元素了, * 新加入元素时,就需要把原缓存里面清除掉一个元素从, * LRU缓存算法要求清除掉最近最少使用的元素, * LinkedHashmap有一个参数access-order可以控制双链表是按访问排序还是插入排序 * 如果access-order==true,则按访问排序, * 每次访问linkedhashmap中元素,就将元素放到链表后面, * 这样新加入元素时,就将链表的第一个元素清除掉,把新元素放上去即可 */ public class LRUCache extends LinkedHashMap{ private static final int MAX_ENTRIES = 3; protected boolean removeEldestEntry(Map.Entry eldest) { return size()>MAX_ENTRIES;//当map的size大于3时,即清理元素 } LRUCache(){ super(MAX_ENTRIES,0.75F,true);//true:按访问顺序排序 } public static void main(String args[]) { LRUCache cache = new LRUCache(); cache.put(1, "a"); cache.put(2, "b"); cache.put(3, "c"); //输出1,2,3 System.out.println(cache.keySet()); cache.get(1); //输出2,3,1 System.out.println(cache.keySet()); cache.put(4, "d"); //输出3,1,4 System.out.println(cache.keySet()); } }
这篇关于java实现LRU缓存的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-07-03万字长文聊聊Web3的组成架构
- 2024-07-02springboot项目无法注册到nacos-icode9专业技术文章分享
- 2024-06-26结对编程到底难不难?答案在这里
- 2024-06-19《2023版Java工程师》课程升级公告
- 2024-06-15matplotlib作图不显示3D图,怎么办?
- 2024-06-1503-Loki 日志监控
- 2024-06-1504-让LLM理解知识 -Prompt
- 2024-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现
- 2024-06-03为什么以及如何要进行架构设计权衡?