LinkedHashMap实现LRU缓存算法
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.locks.ReentrantLock; /**
* 该类是线程安全的带有容量限制的LinkedHashMap
* 超容量的元素采用LRU方式删除
* 线程安全仅限于已经覆盖的几个方法,若有其他需要可自行添加
* 迭代操作不保证数据的一致性,即使remove方法是线程安全的也会抛ConcurrentModificationException
*/
public class LinkedMapLRU<K, V> extends LinkedHashMap<K, V> {
private static final long serialVersionUID = -7911712053305433954L; private int capacity;
private final ReentrantLock lock = new ReentrantLock(); public LinkedMapLRU(int capacity) {
super(capacity, 0.75f, true);
this.capacity = capacity;
}
@Override
public V put(K key, V value) {
try {
lock.lock();
return super.put(key, value);
} finally {
lock.unlock();
}
}
@Override
public V get(Object key) {
try {
lock.lock();
return super.get(key);
} finally {
lock.unlock();
}
}
@Override
public V remove(Object key) {
try {
lock.lock();
return super.remove(key);
} finally {
lock.unlock();
}
} @Override
public boolean removeEldestEntry(Map.Entry<K,V> eldest) {
if(size() > capacity) {
System.out.println(eldest.getKey() +":" + eldest.getValue());
return true;
}
return false;
} public void setMaxSize(int size) {
this.capacity = size;
} }
测试类:
LinkedMapLRU<Integer, Integer> LRU = new LinkedMapLRU<Integer, Integer>(3);
LRU.put(3, 1);
LRU.put(6, 2);
LRU.put(9, 3);
LRU.get(3); //key=3移到顶部
LRU.put(12, 4);
LRU.put(15, 5);
for(Map.Entry<Integer, Integer> entry : LRU.entrySet()) {
System.out.println(entry.getKey() + " " +entry.getValue());
}
测试结果:
6:2
9:3
3 1
12 4
15 5
LinkedHashMap实现LRU缓存算法的更多相关文章
- 如何用LinkedHashMap实现LRU缓存算法
阿里巴巴笔试考到了LRU,一激动忘了怎么回事了..准备不充分啊.. 缓存这个东西就是为了提高运行速度的,由于缓存是在寸土寸金的内存里面,不是在硬盘里面,所以容量是很有限的.LRU这个算法就是把最近一次 ...
- 总是套路留人心, JAVA提供的套路: LinkedHashMap实现LRU缓存; InvocationHandler实现动态代理; fork/join实现窃取算法
1. LinkedHashMap实现LRU缓存 LRU缓存核心是根据访问顺序排序, 自动移除队尾缓存, LinkedHashMap已经实现了这些要求: public LRUCache<K, V& ...
- 面试挂在了 LRU 缓存算法设计上
好吧,有人可能觉得我标题党了,但我想告诉你们的是,前阵子面试确实挂在了 RLU 缓存算法的设计上了.当时做题的时候,自己想的太多了,感觉设计一个 LRU(Least recently used) 缓存 ...
- LinkedHashMap 实现LRU缓存
date: 2020-07-09 13:52:00 updated: 2020-07-21 17:40:00 LinkedHashMap 实现LRU缓存 参考 LinkedHashMap是HashMa ...
- Java集合详解5:深入理解LinkedHashMap和LRU缓存
今天我们来深入探索一下LinkedHashMap的底层原理,并且使用linkedhashmap来实现LRU缓存. 摘要: HashMap和双向链表合二为一即是LinkedHashMap.所谓Linke ...
- HashMap+双向链表手写LRU缓存算法/页面置换算法
import java.util.Hashtable; class DLinkedList { String key; //键 int value; //值 DLinkedList pre; //双向 ...
- come on! 基于LinkedHashMap实现LRU缓存
/** * @Description 基于LinkedHashMap实现一个基于'LRU最近最少使用'算法的缓存,并且最多存MAX个值 * @Author afei * @date:2021/4/25 ...
- LRU缓存算法与pylru
这篇写的略为纠结,算法原理.库都是现成的,我就调用了几个函数而已,这有啥好写的?不过想了想,还是可以介绍一下LRU算法的原理及简单的用法. LRU(Least Recently Used,最近最少 ...
- Java 自定义实现 LRU 缓存算法
背景 LinkedHashMap继承自HashMap,内部提供了一个removeEldestEntry方法,该方法正是实现LRU策略的关键所在,且HashMap内部专门为LinkedHashMap提供 ...
随机推荐
- A1129. Recommendation System
Recommendation system predicts the preference that a user would give to an item. Now you are asked t ...
- A1124. Raffle for Weibo Followers
John got a full mark on PAT. He was so happy that he decided to hold a raffle(抽奖) for his followers ...
- [luogu1341][无序字母对]
luogu1341 思路 欧拉回路和欧拉路的裸题,首先判断是否存在欧拉路或者欧拉回路.当且仅当途中每个点的度数都为偶数时,存在欧拉回路.当且仅当图中度数为奇数的点的个数为2时,存在欧拉路.如果存在欧拉 ...
- Django 路由报错友好提示
这个方法要在设置路由文件内使用也就是urls.py内. """mysite URL Configuration The `urlpatterns` list routes ...
- pytest 3.fixture介绍一 conftest.py
前言: 前面一篇pytest2 讲到用例加setup和teardown可以实现在测试用例之前或之后加入一些操作,但这种是整个脚本全局生效的,如果我想实现以下场景: 用例1需要先登录,用例2不需要登录, ...
- poj 2955"Brackets"(区间DP)
传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题意: 给你一个只由 '(' , ')' , '[' , ']' 组成的字符串s[ ], ...
- (数论 最大公约数 最小公倍数) codeVs 1012 最大公约数和最小公倍数问题
题目描述 Description 输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P,Q的个数 条件: 1.P,Q是正整 ...
- IAR STM32 ------ CSTACK HEAP 设置一次可用栈的大小,HardFault_Hander
CSTACK:限制函数中定义数组的最大值,否则进入HardFault_Hander HEAP:限制动态分配内存(C函数库中的malloc)的大小,不用可以设置为0
- python自动化开发-[第十二天]-前端html
今日概要: 前端基础之html 1.web服务器的本质: #!/usr/bin/python # -*- coding:utf-8 -*- import socket def handle_reque ...
- Go strings.Builder
Go strings.Builder 字符串拼接操作优化 最开始的时候,可能会使用如下的操作: package main func main() { ss := []string{ "sh& ...