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
- 浏览 2592
- 评论(2)
- 论坛回复 / 浏览 (1 / 5664)
- 查看更多
相关推荐
常见的淘汰策略有LRU(最近最少使用)、LFU(最不常用)等。 5. **线程安全**:在多线程环境中,确保对缓存的操作是线程安全的。如果是并发访问,应使用ConcurrentHashMap。 6. **缓存更新与一致性**:当源数据...
这两种实现的核心逻辑相同,都是维护一个按访问顺序排序的键列表,并在缓存满时淘汰最近最少使用的数据。 理解LRU缓存机制有助于优化资源有限的环境下的程序性能,例如数据库查询缓存、网页浏览器缓存等场景。通过...
LRU(Least Recently Used)缓存淘汰算法是一种常见的内存管理策略,用于在固定容量的缓存中决定何时替换掉不再使用的数据。在C语言中实现LRU缓存涉及到数据结构和算法的应用,主要包括链表、哈希表以及优先级队列等...
首先,LRU是一种常用的缓存淘汰策略,它基于“最近最少使用”的原则,当缓存满时,优先淘汰最近最少使用的数据。在ConcurrentLinkedHashMap-LRU 1.3中,这种策略被巧妙地融入到并发环境下,保证了在多线程环境下的...
LRU (Least Recently Used) 算法是一种常用的缓存淘汰策略,它的核心思想是优先淘汰最近最少使用的数据。在计算机系统中,由于内存资源有限,当缓存内容达到最大容量时,必须采取一定的策略来决定哪些数据应该被移除...
首先,我们需要创建一个`Cache`类,它有两个主要属性:`capacity`表示缓存的最大容量,`container`则是一个包含哈希表和链表的结构。哈希表的键是缓存中的键(key),值是一个链表节点,存储对应的键值对(key-value...
它基于一个假设:如果一个数据最近被频繁访问,那么将来它也更有可能被频繁访问。因此,当缓存空间满时,LRU算法会优先淘汰最近最少使用的数据。 在LRU算法中,每个存储在缓存中的数据项都有一个时间戳或访问记录来...
题目描述的"java_leetcode题解之第146题LRU缓存"是LeetCode网站上的一道经典问题,要求设计一个支持添加、删除和获取操作的数据结构,其内部实现了一个固定大小的LRU缓存。具体接口如下: ```java public interface...
下面详细介绍如何使用 Java 实现一个简单的 LRU 缓存机制。 ##### 1. 定义双向链表节点类 `Node` ```java class Node { int key; int value; Node prev; Node next; public Node(int key, int value) { ...
1. 初始化一个固定大小的哈希表和链表。 2. 当添加新元素时,检查哈希表是否已满。如果满,则找到链表尾部的元素(即最旧的元素),将其从哈希表和链表中移除。 3. 将新元素插入链表头部,并在哈希表中添加对应条目...
通过以上代码,我们已经构建了一个简单的LRU缓存系统。在实际应用中,LRU算法不仅可以用于操作系统中的页面替换,还可以应用于数据库查询缓存、编程语言的内存管理(如Java的SoftReference和WeakReference)以及Web...
在这个"LRU.rar_LRU_LRU页面"文件中,包含了一个名为"LRU页面置换.cpp"的C++源代码文件,这应该是一个简单的LRU页面置换算法的实现。开发者可以指定页面的个数,并为每个页面设置优先级。程序会模拟内存的运行过程,...
1. **初始化**:创建一个固定大小的双向链表和哈希表。双向链表的每个节点包含数据和指针,分别指向前一个和后一个节点。哈希表用于存储数据及其对应的链表节点。 2. **插入操作**:当新数据插入时,首先检查哈希表...
LRU 缓存的实现需要考虑多种因素,例如缓存的大小、缓存的类型、数据的使用频率等。为了实现高吞吐和线程安全,LRU 缓存需要使用特殊的数据结构和算法,例如使用 ConcurrentHashMap 来存储缓存数据,并使用 atomic ...
LRU(Least Recently Used)是最常用的页面替换算法之一..."lru.zip"中的"lru.cpp"文件提供了LRU算法的C++实现,而"Huffman.cpp"则可能涉及到了数据压缩技术,这在某些场景下可以与LRU缓存相结合,优化内存的使用效率。
LRU算法的核心在于维护一个有序的数据结构,以便快速定位到最近最少使用的数据。常见的实现方式是使用HashMap与双向链表的组合。HashMap用于快速查找,双向链表则按照访问顺序存储元素,确保最近访问的元素位于链表...
1. 初始化:创建一个固定大小的链表和对应的哈希表,大小根据实际需求设定,例如,假设缓存大小为N。 2. 插入操作:当一个新的数据项请求加入缓存时,首先检查哈希表中是否已存在该数据项。若存在,则更新其在链表...
5. **Hazelcast**:一个开源的内存数据网格,提供分布式缓存、Map、Queue、Topic等功能。 缓存框架的选择应考虑以下几个因素: 1. **性能**:缓存的读写速度和响应时间。 2. **容量管理**:如何处理缓存满的情况,...
这个类通常继承自Android的`BaseCache`或者自定义一个Map结构,如`LinkedHashMap`,因为`LinkedHashMap`已经实现了LRU特性,它维护了一个双向链表,可以按照插入或访问顺序进行操作。当缓存满时,新加入的元素会将最...