一个非常简单的LRU Cache类
2015-12-23 00:00
597 查看
这是一个非常简单的LRU Cache类,利用LinkedHashMap实现
package com.kivensoft.util; import java.util.LinkedHashMap; import java.util.Collection; import java.util.Map; import java.util.ArrayList; /**An LRU cache, based on . * 这个缓存修正了元素的最大值计算公式(). * 如果添加项的时候缓存满了,最老最少用的项将被抛弃 * 这个类是线程安全的,所有函数是线程同步的 * @author: Kiven Lee * @version: 1.0.0 * 2013-10-11 22:17 */ public class LRUCache { private static final float hashTableLoadFactor = 0.75f; private LinkedHashMap map; protected int cacheSize; /**创建新的缓存类. * @param cacheSize 最大缓存的记录数量 */ public LRUCache(int cacheSize) { this.cacheSize = cacheSize; int hashTableCapacity = (int) Math.ceil(cacheSize / hashTableLoadFactor) + 1; map = new LinkedHashMap(hashTableCapacity, hashTableLoadFactor, true) { // 内嵌匿名类 private static final long serialVersionUID = 1; @Override protected boolean removeEldestEntry(Map.Entry eldest) { return size() > LRUCache.this.cacheSize; } }; } /**根据键获取缓存中的数据. * @param key 键值 * @return 对应键值的数据, 如果不存在则返回null */ public synchronized V get(K key) { return map.get(key); } /**把记录加入缓存中. * @param key 键值 * @param value 对应的数据 */ public synchronized void put(K key, V value) { map.put(key, value); } /**清空缓存. */ public synchronized void clear() { map.clear(); } /**返回缓存中已经使用的记录数 * @return 已经使用的数量. */ public synchronized int usedEntries() { return map.size(); } /**以集合的类型返回所有缓存的副本 * @return a 所有缓存内容的副本. */ public synchronized Collection<Map.Entry> getAll() { return new ArrayList<Map.Entry>(map.entrySet()); } // Test routine for the LRUCache class. public static void main(String[] args) { LRUCache c = new LRUCache(3); c.put("1", "one"); // 1 c.put("2", "two"); // 2 1 c.put("3", "three"); // 3 2 1 c.put("4", "four"); // 4 3 2 if (c.get("2") == null) throw new Error(); // 2 4 3 c.put("5", "five"); // 5 2 4 c.put("4", "second four"); // 4 5 2 // Verify cache content. if (c.usedEntries() != 3) throw new Error(); if (!c.get("4").equals("second four")) throw new Error(); if (!c.get("5").equals("five")) throw new Error(); if (!c.get("2").equals("two")) throw new Error(); // List cache content. for (Map.Entry e : c.getAll()) System.out.println(e.getKey() + " : " + e.getValue()); } } // end class LRUCache
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树