用LinkedHashMap实现LRU(Java面试常考)

56 篇文章 4 订阅

LRU(Least Recently Used):

最近最久未使用策略,优先淘汰最久未使用的数据,也就是上次被访问时间距离现在最久的数据。该策略可以保证内存中的数据都是热点数据,也就是经常被访问的数据,从而保证缓存命中率。

使用LinkedHashMap实现

LinkedHashMap底层就是用的【**HashMap**】加【**双链表**】实现的,而且本身已经实现了按照访问顺序的存储。此外,LinkedHashMap中本身就实现了一个方法removeEldestEntry用于判断是否需要移除最不常读取的数,方法默认是直接返回false,不会移除元素,所以需要【重写该方法】,即当缓存满后就移除最不常用的数。

具体实现如下:
package stone.scu.cd;

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;

//实现LRU
//使用LinkedHashMap实现
//LinkedHashMap底层就是用的【HashMap 加 双链表】实现的,而且本身已经实现了按照访问顺序的存储。
//此外,LinkedHashMap中本身就实现了一个方法removeEldestEntry用于判断是否需要移除最不常读取的数,
//方法默认是直接返回false,不会移除元素,所以需要重写该方法,即当缓存满后就移除最不常用的数。

public class LRU<K,V> {
	private LinkedHashMap<K, V> map;
	private int cacheSize;
	
	public LRU(int cacheSize)
	{
		this.cacheSize = cacheSize;
		map = new LinkedHashMap<K,V>(16,0.75F,true){
			
			@Override
			protected boolean removeEldestEntry(Entry eldest) {
				if(cacheSize + 1 == map.size()){
					return true;
				}else{
					return false;
				}
			}
		};  //end map
	}
	
	public synchronized V get(K key) {
		return map.get(key);
	}
	public synchronized void put(K key,V value) {
		map.put(key, value);
	}
	public synchronized void clear() {
		map.clear();
	}
	public synchronized int usedSize() {
		return map.size();
	}
	public void print() {
		for (Map.Entry<K, V> entry : map.entrySet()) {
			System.out.print(entry.getValue() + "--");
		}
		System.out.println();
	}
	
	public static void main(String[] args) {
		LRU<String, Integer> LRUMap = new LRU<>(3);
		LRUMap.put("key1", 1);
		LRUMap.put("key2", 2);
		LRUMap.put("key3", 3);
		LRUMap.print();
		System.out.println();
		LRUMap.put("key4", 4);
		LRUMap.print();
	}
}

输出结果:

1--2--3--

2--3--4--
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值