栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > Java面试题

请用Java设计一个Least Recently Used (LRU) 缓存

Java面试题 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

请用Java设计一个Least Recently Used (LRU) 缓存

LRU介绍:

LRU是Least Recently Used的缩写,即最少使用页面置换算法,是为虚拟页式存储管理服务的。

思路介绍:

可以使用两个标准的数据结构来实现,Map和Queue。因为需要支持多线程,需要使用实现了java.utili.concurrent.*的Map和Queue。

主要思路是使用一个Queue来维护FIFO和Map来对数据进行排序,当向缓存添加新的元素时,共有以下三种可能:

1. 如果该元素已经在Cache中存在(Map),我们会从queue中删除改元素并将其添加到queue的第一个位置。

2. 如果缓存已满无法新增新的元素,我们会从queue和Map中删除最后面的那个元素并把新元素添加进来。

3. 同时在Map和Queue中增加新的元素

参考答案:

import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.ConcurrentlinkedQueue; public class LRUCache<K, V> { //LRU缓存的最大容量.private final int capacity;//用来保持最近使用的元素的Queue.private ConcurrentlinkedQueue<K> queue;private ConcurrentHashMap<K, V> map; public LRUCache(final int capacity) {this.capacity = capacity;this.queue= new ConcurrentlinkedQueue<K>();this.map= new ConcurrentHashMap<K, V>(capacity);} public V get(final K key) {return map.get(key);} public synchronized void put(final K key, final V value) {if(key == null || value == null) {throw new NullPointerException();}if (map.containsKey(key)) {queue.remove(key);}while (queue.size() >= capacity) {K expiredKey = queue.poll();if (expiredKey != null) {map.remove(expiredKey);}}queue.add(key);map.put(key, value);}}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/263973.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号