import java.util.HashMap;import java.util.LinkedList;/* * 基于Java LinkedList,实现Android大数据缓存策略 * 作者:Zhang Phil * 原文出处:http://blog.csdn.net/zhangphil *  * 实现原理:原理的模型认为:在LinkedList的头部元素是最旧的缓存数据,在LinkedList的尾部是最新的缓存数据。 * 在一个LinkedList(类型C的链表)维护一个存储堆栈,添加元素时候顺序、依次添加。 * *原理实现的具体方案:只要调用缓存的get()方法后,立即将此元素从原先在LinkedList的位置更新到LinkedList最后的位置。 *比如,原先是:1,2,3,4,5。当get了2后,现在的顺序是:1,3,4,5,2。 * * 缓存空间满的情况下,则删除最旧的元素(在最头部),以腾出空间。  * 比如,缓存空间是5,原先缓存已经缓存了5个元素:a,b,c,d,e, * 当再次添加元素 f 时候,因为缓存空间是5容不下6个元素,所以删除最头部的元素a,把f追加到最尾部变成: b,c,d,e,f *  * 具体使用:类似于Android的LruCache,对外公开两个通用(通用,意味着可以存Bitmap或者类似的数据)方法供存储和读取使用: * public void put(String key, Object obj); *public Object get(String key); *即通用的<key,value>存储和读取模型。注意:使用者应保证存储时的key唯一。 * */public class CacheBasedOnLinkedList {// Capacity默认的缓存容量private static int CAPACITY = 30;private LinkedList<HashMap<String, Object>> mLinkedList;private final String KEY = "key", VALUE = "value";public CacheBasedOnLinkedList() {init();}public CacheBasedOnLinkedList(int capacity) {CAPACITY = capacity;init();}private void init() {mLinkedList = new LinkedList<HashMap<String, Object>>();}// 动态调整缓存空间大小。// 注意!该方法极可能线程不安全。public void ensureCapacity(int capacity) {if (capacity >= CAPACITY) {// 若比原先大,直接赋值即可// Capacity = capacity;} else {// 若新调整的容量比原先还要小,那么一个一个的删掉头部元素直到相等while (mLinkedList.size() > capacity) {HashMap<String, Object> map = mLinkedList.removeFirst();System.out.println("\n删除-> " + map.get(KEY) + ":"+ map.get(VALUE));}}CAPACITY = capacity;System.out.println("\n重新调整缓存容量为:" + CAPACITY);}// 把需要缓存的数据以<key,value>键值对的形式存入缓存。// 存之前,要检查缓存是否满,满了的话就删除LinkedList第一个元素。public void put(String key, Object obj) {if (mLinkedList.size() < CAPACITY) {} else {HashMap<String, Object> map = mLinkedList.removeFirst();System.out.println("\n缓存空间已满!删除-> " + map.get(KEY) + ":"+ map.get(VALUE));}HashMap<String, Object> map = new HashMap<String, Object>();map.put(KEY, key);map.put(VALUE, obj);mLinkedList.addLast(map);System.out.println("\n缓存-> " + map.get(KEY) + ":" + map.get(VALUE));}// 根据key读出缓存数据// 原理:从头到尾遍历整个链表LinkedList,只要检查到元素中的key和给定的key相同,立即返回。// 同时更新该元素在LinkedList中位置:从原先的位置放到最后一个位置。public Object get(String key) {Object obj = null;for (HashMap<String, Object> map : mLinkedList) {if (map.get(KEY).equals(key)) {System.out.println("读取->" + key + ":" + map.get(VALUE));mLinkedList.remove(map);mLinkedList.addLast(map);return map.get(VALUE);}}return obj;}//// 仅仅是打印输出现在最新的缓存数据情况。//private void out() {//System.out.print("最新缓存情况:");//for (HashMap<String, Object> map : mLinkedList) {//System.out.print(map.get(KEY) + ":" + map.get(VALUE) + ",");//}//}//// 测试//public static void main(String[] args) {//CacheBasedOnLinkedList cache = new CacheBasedOnLinkedList(2);////Random rand = new Random();////for (int i = 0; i < 100; i++) {//cache.ensureCapacity(rand.nextInt(100) + 1);//cache.put(i + "", i);//cache.get(rand.nextInt(100) + "");//cache.out();//}//}}

更多相关文章

  1. 简单的三方登录SDK示例,Android Activity之间数据的传递
  2. Android开发之数据保存技术(一)
  3. Android联系人数据库全解析(4)
  4. Android联系人数据库全解析(3)
  5. Android 数据序列化总结
  6. Android数据库操作查询中Cursor类的问题
  7. 关于Android中的数据存储
  8. 在SQLite数据库中获取新插入数据自增长的ID值(传智播客笔记)

随机推荐

  1. Android提示版本更新的实现
  2. Android(安卓)Recovery模式
  3. Android平台常见属性集合
  4. Android(安卓)SDK Manager更新不了的解决
  5. Android(安卓)中RelativeLayout各个属性
  6. 没事抽空学——常用界面组件属性
  7. android 呼出电话的监听(去电监听)
  8. Android(安卓)Studio安装完后,遇到了sdk m
  9. Android(安卓)第一次启动时预安装apk
  10. Android中listview中的button