加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

基于Java LinkedList,实现Android大数据缓存策略

发布时间:2020-12-14 23:28:16 所属栏目:Java 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 import java.util.HashMap; import java.util.LinkedList; /* * 基于Java LinkedList,实现Android大数据缓存策略 * 作者:Zhang Phil * 原文出处:htt

以下代码由PHP站长网 52php.cn收集自互联网

现在PHP站长网小编把它分享给大家,仅供参考

    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,5,2。 
     * 
     *  缓存空间满的情况下,则删除最旧的元素(在最头部),以腾出空间。  
     * 比如,缓存空间是5,原先缓存已经缓存了5个元素:a,b,c,d,e, 
     * 当再次添加元素 f 时候,因为缓存空间是5容不下6个元素,所以删除最头部的元素a,把f追加到最尾部变成: b,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();  
    //      }  
    //  }  
    }  

以上内容由PHP站长网【52php.cn】收集整理供大家参考研究

如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读