import java.util.AbstractMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
import java.util.Set;
/**
* The PooledMap is used to cache some Objects in a certain count.
*
* @param <Key>
* @param <Value>
*/
public class PooledMap<Key, Value> extends AbstractMap<Key, Value>{
private int maxCount = 10;
private Queue<Entry> queue = new LinkedList<Entry>();
/**
* The Entry for this Map.
* @author Andy Han
*
*/
private class Entry implements Map.Entry<Key, Value>{
private Key key;
private Value value;
public Entry(Key key, Value value){
this.key = key;
this.value = value;
}
@Override
public String toString() {
return key + "=" + value;
}
public Key getKey() {
return key;
}
public Value getValue() {
return value;
}
public Value setValue(Value value) {
return this.value = value;
}
}
/**
* Default Constructor.
*/
public PooledMap() {
}
/**
* Constructor.
* @param size the size of the pooled map;
*/
public PooledMap(int size) {
maxCount = size;
}
@Override
public Value put(Key key, Value value) {
while(queue.size() >= maxCount){
queue.remove();
}
queue.add(new Entry(key, value));
return value;
}
@Override
public Value get(Object key){
for(Iterator<Entry> iter = queue.iterator();iter.hasNext();){
Entry type = iter.next();
if(type.key.equals(key)){
queue.remove(type);
queue.add(type);
return type.value;
}
}
return null;
}
@Override
public Set<Map.Entry<Key, Value>> entrySet() {
Set<Map.Entry<Key, Value>> set = new HashSet<Map.Entry<Key, Value>>();
set.addAll(queue);
return set;
}
@Override
public void clear() {
queue.clear();
}
@Override
public Set<Key> keySet() {
Set<Key> set = new HashSet<Key>();
for(Entry e : queue){
set.add(e.getKey());
}
return set;
}
@Override
public Value remove(Object obj) {
for(Entry e : queue){
if(e.getKey().equals(obj)){
queue.remove(e);
return e.getValue();
}
}
return null;
}
public static void main(String[] args) {
PooledMap<String, String> map = new PooledMap<String, String>(3);
map.put("1", "11111");
map.put("2", "22222");
map.put("3", "33333");
System.out.println(map.size() == 3);
System.out.println(map.values().size() == 3);
System.out.println(map.remove("3") == "33333");
System.out.println(map.size() == 2);
System.out.println(map.get("1") == "11111");
map.put("4", "44444");
System.out.println(map.get("6") == null);
System.out.println(map.get("4") == "44444");
System.out.println(map.size() == 3);
System.out.println(map.containsKey("4"));
System.out.println(map.containsValue("44444"));
System.out.println(map.containsKey("1"));
System.out.println(map.containsKey("2"));
System.out.println(map.isEmpty() == false);
map.remove("1");
map.remove("4");
map.remove("2");
System.out.println(map.isEmpty() == true);
map.clear();
}
}
分享到:
- 2008-08-01 11:12
- 浏览 2529
- 评论(2)
- 论坛回复 / 浏览 (1 / 5647)
- 查看更多
相关推荐
lru缓存leetcode ...第一个利用“map.keys()”,它按照插入顺序返回哈希图中的键。 就个人而言,我认为这是作弊,因为哈希图最初是未排序的。 因此,第二种解决方案使用哈希图和双向链表来跟踪节点的顺序。
Java利用ConcurrentHashMap实现本地缓存demo;...基本功能有缓存有效期、缓存最大数、缓存存入记录、清理线程、过期算法删除缓存、LRU算法删除、获取缓存值等功能。 复制到本地项目的时候,记得改包路径哦~
主要介绍了高吞吐、线程安全的LRU缓存详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
受haslru算法的启发,但是使用Map支持任何类型的键,而不仅仅是字符串和quick-lru简单的“最近最少使用”(LRU)缓存,在需要缓存某些内容并限制内存使用量时很有用。 受hashlru算法启发,但改用Map支持任何类型的键...
1.使用Map记录缓存值,使用链表记录缓存操作顺序,最后操作的缓存放在链表头部,链表尾部就是最少操作的缓存 2.读取缓存时,更新缓存操作顺序,将缓存节点从链表中
原作者通过两个MAP对象来记录缓存数据和LRU队列,注意其中的LRU队列并不是按照常用的方式使用LIST链表,而是使用MAP来代替LIST,有关这一点原作者已做了说明。 另外还有人将MRU与LRU组合在一起使用,当然如果清楚了...
LRU缓存使用的数据结构使用双向链表实现的队列。 队列的最大大小将等于可用帧的总数(缓存大小)。 最近使用的页面将靠近前端,最近最少使用的页面将靠近后端。 以页码为键,以相应队列节点的地址为值的哈希。方法...
LRUCache11:只有Header的C 11 LRU 缓存模板类,允许您定义键,价值和可选Map类型。使用一个双链表。
2.4.2 LRUMap类... 30 第3章 AOP. 33 3.1 AOP概论... 33 3.2 AspectJ. 35 3.3 Spring AOP. 36 3.3.1 实现Advice. 36 3.3.2 编写业务代码... 37 3.3.3 装配pointcut和advice. 38 3.3.4 运行主程序... 39 3.4 动态代理...
LRU LRU 是一个轻量级的用于 list 和 map<K> 容器。 用 C++11 编写LRU 是独立的。 没有依赖性。 LRU 很小。 仅标题。 LRU 是跨平台的。 LRU 是 zlib/libpng 许可的。快速教程根据需要创建lru::list或lru::map结构。 ...
使用了一个对象作为缓存,一个数组配合着记录添加进对象时的顺序,判断是否到达上限,若到达上限取数组中的第一个元素key,对应删除对象中的键值。 /** * FIFO队列算法实现缓存 * 需要一个对象和一个数组作为辅助...
LRU Cache是一个Cache的置换算法,含义是“近少使用”,把满足“近少使用”的数据从Cache中剔除出去,并且保证Cache中第一个数据是近刚刚访问的,因为这样的数据更有可能被接下来的程序所访问。 LRU的应用比较...
LruCache只有一个构造函数,并且有一个必传参数: public LruCache(int maxSize) { if (maxSize <= 0) { throw new IllegalArgumentException("maxSize <= 0"); } // 初始化最大缓存大小. this.maxSize = ...
创建测试数据库,并在数据库中创建一个t_user 表,其中包含三个字段: . id(int) . name(varchar) . sex(int) 。 3. 为了在开发过程更加直观,我们需要将ibatis 日志打开以便观察ibatis 运作的细节...
python记忆 一个强大的Python缓存库,具有TTL支持和多种算法选项。 如果您喜欢这项工作,请在GitHub上加注。为什么选择这个图书馆? 也许您了解Python 3中的 ,并且您可能想知道为什么我要重新发明轮子。 好吧,实际...
我们有一个自定义的双链表实现。 双链表 双链表的API如下: 姓名 描述 insert_left 从左侧将元素插入到双向链接列表中。 insert_right 从右侧将元素插入到双向链接列表中。 pop_left 删除并返回双向链表中最...
java lru leetcode LRU缓存的实现 LRU - 最近最少使用。 完成清单: C ...LRU 缓存问题进行了检查。...实现非常相似,但将使用内置“Map”库。...实现将是一个独立的包,可以为任何软件开发...只需根据您的关注打开一个问题:D
用得技术方案非常简单,从lua脚本直接创建一个kafka producer,发送数据到kafka ``` wget https://github.com/doujiang24/lua-resty-kafka/archive/master.zip yum install -y unzip unzip lua-resty-kafka-...
LRUCache11仅标头的C ++ 11 LRU Cache模板类,它使您可以定义键,值和(可选)映射类型。 使用双向链接列表和std :: unordered...目标是创建一个快速的仅LRUCache标头库,并避免任何依赖,如boost。 享受一下,给我留言
<cacheModel id="categoryCache" type="LRU"> <flushInterval hours="24"/> <property name="size" value="100"/> </cacheModel> ...