`

作了一个有缓存功能的Map, 大小固定,采用LRU,只保留最近使用的.

阅读更多
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();
	}
}
分享到:
评论
2 楼 flying5 2013-01-30  
queue.remove(type); 
queue.add(type); 
效率较低

删除的是最先put的对象
1 楼 惊鸿逝水 2008-08-01  
你这不算是LRU,删除的是最近最少使用的对象,不是最先put的对象

相关推荐

    java map 实现缓存技术

    常见的淘汰策略有LRU(最近最少使用)、LFU(最不常用)等。 5. **线程安全**:在多线程环境中,确保对缓存的操作是线程安全的。如果是并发访问,应使用ConcurrentHashMap。 6. **缓存更新与一致性**:当源数据...

    LRU 缓存机制.docx

    这两种实现的核心逻辑相同,都是维护一个按访问顺序排序的键列表,并在缓存满时淘汰最近最少使用的数据。 理解LRU缓存机制有助于优化资源有限的环境下的程序性能,例如数据库查询缓存、网页浏览器缓存等场景。通过...

    c语言实现LRU缓存.zip

    LRU(Least Recently Used)缓存淘汰算法是一种常见的内存管理策略,用于在固定容量的缓存中决定何时替换掉不再使用的数据。在C语言中实现LRU缓存涉及到数据结构和算法的应用,主要包括链表、哈希表以及优先级队列等...

    concurrentlinkedhashmap-lru-1.3.jar.zip

    首先,LRU是一种常用的缓存淘汰策略,它基于“最近最少使用”的原则,当缓存满时,优先淘汰最近最少使用的数据。在ConcurrentLinkedHashMap-LRU 1.3中,这种策略被巧妙地融入到并发环境下,保证了在多线程环境下的...

    实现 LRU 算法,和 Caffeine 和 Redis 中的缓存淘汰策略.docx

    LRU (Least Recently Used) 算法是一种常用的缓存淘汰策略,它的核心思想是优先淘汰最近最少使用的数据。在计算机系统中,由于内存资源有限,当缓存内容达到最大容量时,必须采取一定的策略来决定哪些数据应该被移除...

    js-leetcode题解之LRU缓存-题解.zip

    首先,我们需要创建一个`Cache`类,它有两个主要属性:`capacity`表示缓存的最大容量,`container`则是一个包含哈希表和链表的结构。哈希表的键是缓存中的键(key),值是一个链表节点,存储对应的键值对(key-value...

    LRU.rar_LRU_coastzew_缓存算法

    它基于一个假设:如果一个数据最近被频繁访问,那么将来它也更有可能被频繁访问。因此,当缓存空间满时,LRU算法会优先淘汰最近最少使用的数据。 在LRU算法中,每个存储在缓存中的数据项都有一个时间戳或访问记录来...

    java-leetcode题解之第146题LRU缓存.zip

    题目描述的"java_leetcode题解之第146题LRU缓存"是LeetCode网站上的一道经典问题,要求设计一个支持添加、删除和获取操作的数据结构,其内部实现了一个固定大小的LRU缓存。具体接口如下: ```java public interface...

    LRU 缓存机制(java代码).docx

    下面详细介绍如何使用 Java 实现一个简单的 LRU 缓存机制。 ##### 1. 定义双向链表节点类 `Node` ```java class Node { int key; int value; Node prev; Node next; public Node(int key, int value) { ...

    lru.rar_LRU

    1. 初始化一个固定大小的哈希表和链表。 2. 当添加新元素时,检查哈希表是否已满。如果满,则找到链表尾部的元素(即最旧的元素),将其从哈希表和链表中移除。 3. 将新元素插入链表头部,并在哈希表中添加对应条目...

    Java实现LRU算法.zip

    通过以上代码,我们已经构建了一个简单的LRU缓存系统。在实际应用中,LRU算法不仅可以用于操作系统中的页面替换,还可以应用于数据库查询缓存、编程语言的内存管理(如Java的SoftReference和WeakReference)以及Web...

    LRU.rar_LRU_LRU页面

    在这个"LRU.rar_LRU_LRU页面"文件中,包含了一个名为"LRU页面置换.cpp"的C++源代码文件,这应该是一个简单的LRU页面置换算法的实现。开发者可以指定页面的个数,并为每个页面设置优先级。程序会模拟内存的运行过程,...

    LRU.zip_LRU

    1. **初始化**:创建一个固定大小的双向链表和哈希表。双向链表的每个节点包含数据和指针,分别指向前一个和后一个节点。哈希表用于存储数据及其对应的链表节点。 2. **插入操作**:当新数据插入时,首先检查哈希表...

    lru.zip_LRU 内存

    LRU(Least Recently Used)是最常用的页面替换算法之一..."lru.zip"中的"lru.cpp"文件提供了LRU算法的C++实现,而"Huffman.cpp"则可能涉及到了数据压缩技术,这在某些场景下可以与LRU缓存相结合,优化内存的使用效率。

    LRU.rar_LRU

    LRU算法的核心在于维护一个有序的数据结构,以便快速定位到最近最少使用的数据。常见的实现方式是使用HashMap与双向链表的组合。HashMap用于快速查找,双向链表则按照访问顺序存储元素,确保最近访问的元素位于链表...

    LRU.zip_lru算法

    1. 初始化:创建一个固定大小的链表和对应的哈希表,大小根据实际需求设定,例如,假设缓存大小为N。 2. 插入操作:当一个新的数据项请求加入缓存时,首先检查哈希表中是否已存在该数据项。若存在,则更新其在链表...

    缓存、缓存算法和缓存框架简介.docx

    5. **Hazelcast**:一个开源的内存数据网格,提供分布式缓存、Map、Queue、Topic等功能。 缓存框架的选择应考虑以下几个因素: 1. **性能**:缓存的读写速度和响应时间。 2. **容量管理**:如何处理缓存满的情况,...

    Lru算法缓存解决图片OOM

    这个类通常继承自Android的`BaseCache`或者自定义一个Map结构,如`LinkedHashMap`,因为`LinkedHashMap`已经实现了LRU特性,它维护了一个双向链表,可以按照插入或访问顺序进行操作。当缓存满时,新加入的元素会将最...

Global site tag (gtag.js) - Google Analytics