1.LRU算法介绍:
LRU是Least Recently Used 近期最少使用算法。内存管理的一种页面置换算法,对于在内存中但又不用的数据快(内存块)叫做LRU,
Oracle会根据那些数据属于LRU而将其移出内存而腾出空间来加载另外的数据,一般用于大数据处理的时候很少使用的数据那么就直接请求数据库,如果经常请求的数据就直接在缓存里面读取。
最近最久未使用(LRU)的页面置换算法,是根据页面调入内存后的使用情况进行决策的。由于无法预测各页面将来的使用情况,
只能利用“最近的过去”作为“最近的将来”的近似,因此,LRU置换算法是选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,
用来记录一个页面自上次被访问以来所经历的时间t,当须淘汰一个页面时,选择现有页面中其t值最大的,即最近最久未使用的页面予以淘汰(可以使用这种方法去实现)。
2.LinkedHashMap
1、LinkedHashMap可以认为是HashMap+LinkedList,即它既使用HashMap操作数据结构,又使用LinkedList维护插入元素的先后顺序。
2、LinkedHashMap的基本实现思想就是----多态。可以说,理解多态,再去理解LinkedHashMap原理会事半功倍;反之也是,对于LinkedHashMap原理的学习,也可以促进和加深对于多态的理解。
initialCapacity 初始容量大小,使用无参构造方法时,此值默认是16
loadFactor 加载因子,使用无参构造方法时,此值默认是 0.75f
accessOrder false: 基于插入顺序 true: 基于访问顺序 重点看看accessOrder的作用,使用无参构造方法时,此值默认是false。
3.具体实现
package com.eebbk.onlinelesson.scheduler;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* @Description: 实现LRU代码实现
* @Time: 2020/12/3 17:23
*/
public class LRUCache<K, V> extends LinkedHashMap<K, V> {
//初始内存容量
private int capacity;
//构造方法,传入一个参数
LRUCache(int capacity){
//调用LinkedHashMap,传入参数
super(capacity,0.75f,true);
this.capacity=capacity;
//传递指定的最大内存容量
}
默认的removeEldestEntry方法是返回false的,也就是不会进行删除,而是进行扩容
@Override
public boolean removeEldestEntry(Map.Entry<K, V> eldest){
//,每加入一个元素,就判断是size是否超过了已定的容量
System.out.println("此时的size大小="+size());
if((size()>capacity))
{
这个意思就是说当map中的数据量大于指定的缓存个数的时候,就自动删除最老的数据
System.out.println("超出已定的内存容量,把链表顶端元素移除:"+eldest.getValue());
}
return size()>capacity;
}
public static void main(String[] args) throws Exception{
//initialCapacity 初始容量大小5
Map<Integer,Integer> map=new LRUCache<Integer, Integer>(5);
//新增6个值
for(int i=1;i<=6;i++)
{
map.put(i, i);
}
//遍历输出
for(java.util.Map.Entry<Integer, Integer> entry: map.entrySet()){
System.out.println(entry.getValue());
}
}
/* 输出
此时的size大小=1
此时的size大小=2
此时的size大小=3
此时的size大小=4
此时的size大小=5
此时的size大小=6
超出已定的内存容量,把链表顶端元素移除:1
2
3
4
5
6
*/
}