
起飞,手撸了一个 LRU 缓存,源码原来这么简单!
LRU 介绍
LRU是 Least Recently Used 的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。
简单的说就是,对于一组数据,例如:int[] a = {1,2,3,4,5,6},如果1,2这几个数字经常被使用,那么会排在3,4,5,6的后面,数组变成如下:int[] a = {3,4,5,6,1,2},如果一个数字,经常不被使用,就会排在最前面!
LRU 算法,一般用于热点数据的查询,比如新闻信息,越是能被用户看得多的新闻,越有可能被别的用户所看到,对于那种基本没人访问的新闻,基本都类似存入大海!
在 Java 中,就有这么一个集合类实现了这个功能,它就是LinkedHashMap!
LinkedHashMap 介绍
我们都知道,在java集合中,LinkedHashMap 继承自 HashMap,底层是一个双向链表的数据结构,与 HashMap 不同的是,LinkedHashMap 初始化阶段有个参数accessOrder,默认是false。
如果传入的是true,则会把最近访问过的元素放在链表后面,放置顺序是访问的顺序,测试如下:
输出结果如下:
可以得知,当我们将accessOrder设置为true的时候,经常被访问的元素会放入前面!
我们利用这个特性,使用 LinkedHashMap 来实现一个 LRU 缓存,操作如下:
● 创建一个 LinkedHashMap 对象,将accessOrder设置为true;
● 设定 LinkedHashMap 的容量为n,超过这个值就删除多余的元素;
● 重写 LinkedHashMap 中removeEldestEntry()方法;
其中removeEldestEntry()表示,如果返回的是true,就会移除最近不被使用的元素,如果返回false,不做任何操作,这个方法每次在add()的时候就会调用。
创建一个 LRU 缓存类,内容如下:
测试使用:
输出结果如下:
文章转载自公众号:Java极客技术
