基于Java LinkedList,實現Android大數據緩存策略

cm54 9年前發布 | 4K 次閱讀 Java Android

    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();  
//      }  
//  }  
}  </pre> 


 本文由用戶 cm54 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!