import java.util.LinkedHashMap;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class LRUCache<K, V> extends LinkedHashMap<K, V> {
private static final long serialVersionUID = -656812640814484468L;
/** 默认最大容量 */
private static final int DEFAULT_MAX_CAPACITY = 300;
private static final int INITIALCAPACITY = 16;
/** 负载因子 */
private static final float DEFAULT_LOAD_FACTOR = 0.75f;
private final Lock lock = new ReentrantLock();
private volatile int maxCapacity;
/**
* <br>
* ------------------------------<br>
*/
public LRUCache() {
this(DEFAULT_MAX_CAPACITY);
}
public LRUCache(int maxCapacity) {
super(INITIALCAPACITY, DEFAULT_LOAD_FACTOR, Boolean.TRUE);
this.maxCapacity = maxCapacity;
}
@Override
protected boolean removeEldestEntry(java.util.Map.Entry<K, V> eldest) {
return size() > maxCapacity;
}
@Override
public V get(Object key) {
try {
lock.lock();
return super.get(key);
} finally {
lock.unlock();
}
}
public V put(K key, V value) {
try {
lock.lock();
return super.put(key, value);
} finally {
lock.unlock();
}
}
@Override
public V remove(Object key) {
try {
lock.lock();
return super.remove(key);
} finally {
lock.unlock();
}
}
@Override
public boolean containsKey(Object key) {
try {
lock.lock();
return super.containsKey(key);
} finally {
lock.unlock();
}
}
@Override
public void clear() {
try {
lock.lock();
super.clear();
} finally {
lock.unlock();
}
}
@Override
public int size() {
try {
lock.lock();
return super.size();
} finally {
lock.unlock();
}
}
/**
* 获得maxCapacity
* @return the maxCapacity
*/
public int getMaxCapacity() {
return maxCapacity;
}
/**
* 设置maxCapacity
* @param maxCapacity the maxCapacity to set
*/
public void setMaxCapacity(int maxCapacity) {
this.maxCapacity = maxCapacity;
}
}
public class Main {
public static void main(String[] args) {
LRUCache<String, String> lruCache = new LRUCache<String, String>(2);
lruCache.put("1", "1");
lruCache.put("2", "2");
System.out.println(lruCache);
lruCache.put("3", "3");
System.out.println(lruCache);
}
}
{1=1, 2=2}
{2=2, 3=3}
分享到:
相关推荐
自定义实现LRUCache的实现和调用. 简单地扩展LinkedHashMap
Android使用LruCache缓存图片,
异步下载图片,使用LruCache和手机目录缓存,GridView滑动的时候取消下载图片,效果流畅,这里是代码,更多的介绍http://blog.csdn.net/xiaanming/article/details/9825113
这是一个用LruCache算法的listView图片加载工具类,可以直接下载后接入自定义的Adapter即可。
AsyncTask的使用及ListView的常见优化 asyncTask异步加载数据 使用了LruCache优化图片加载 通过滑动监听提高ListView滑动流畅度.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习...
简易单链表增删改查功能实现。新增内容:新增单链表LruCache算法增删改查,对学习LruCache 算法有一定帮助。
C# LRUcache C# LRUcache
Android缓存的一个Demo,对Lrucache 和Srofrencen 进行了分析的使用,希望大家一起学习交流
LruCache和DiskLruCache实现二级缓存的自定义ImageLoader
PhotosWallDemo 结合LruCache和DiskLruCache PhotosWallDemo 结合LruCache和DiskLruCache
基于Andoird的LRUCache机制介绍
LruCache缓存
LRUCache11:只有Header的C 11 LRU 缓存模板类,允许您定义键,价值和可选Map类型。使用一个双链表。
此DEMO主要是针对帧动画,实现方式有三种:1、FrameAnimation+xml;2、代码中加载每一帧;3、自定义动画,采用LruCache对每一帧图片进行内存优化防止图片oom。
lua-resty-lrucache, 在 LuaJIT FFI上,基于Lua缓存 电子邮件名称lua-resty-lrucache - 基于 LuaJIT FFI的land缓存目录NAME状态概要说明描述方法新插件设置 。删除先决条件安装工具待办事项社区服务英文邮件列表中文...
LruCache 的使用 Demo,虽然加载了非常大的图片,但是使用了 Lrucache 作为缓存,使整个 app 的内存使用情况降下来了。
主要是对LruCache的简单使用介绍,http://blog.csdn.net/richardli1228/article/details/50014895
LruCache 源码,摘抄下来,方便查阅。 https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/util/LruCache.java
LruCache实例demo 详情请看:http://blog.csdn.net/zxw136511485/article/details/52153287 Android 缓存浅谈(一)
这是一个包含异步加载、网络编程、JSON解析、LruCache图片缓存的简易的ListView图文混排Demo.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。