Android LRU算法中LinkedHashMap补充 <11>

来源:互联网 发布:ubuntu gps.h 编辑:程序博客网 时间:2024/06/09 23:56

上一篇提到LRUCache.java文件中涉及到下面的变量参数,说的不是太清楚,下面是单独的事例补充一下.

private int maxSize;

另外,如果让LinkedHashMap移除超出的部分,比如设置maxSize=10,结果向里面put了12对象,那么其中就要为了保证只有10个对象,就需要移除多余的两个,LinkedHashMap设计的是移除最先put进来的那那个对象,也就是第一和第二个put进来的那两个对象.

/**     * Removes the entry for {@code key} if it exists.     *     * @return the previous value mapped by {@code key}.     */    public final V remove(K key) {        if (key == null) {            throw new NullPointerException("key == null");        }        V previous;        synchronized (this) {            previous = map.remove(key);            if (previous != null) {                size -= safeSizeOf(key, previous);            }        }        if (previous != null) {            entryRemoved(false, key, previous, null);        }        return previous;    }


下面在上一篇的基础上再进一步的程序调整:

DurianUtil.java
package org.durian.durianlrubitmap.util;import android.util.Log;import java.util.HashMap;import java.util.Iterator;import java.util.LinkedHashMap;import java.util.Map;/** * Project name : DurianLRUBitmap * Created by zhibao.liu on 2016/1/13. * Time : 18:33 * Email warden_sprite@foxmail.com * Action : durian */public class DurianUtil {    private final static String TAG="DurianUtil";    private final static int LINKED_MAX=10;    public static void DurianLinkedHashMap(){        Map<Integer,String> map=new LinkedHashMap<Integer, String>();        map.put(5,"hello,zhibao.liu");        map.put(8,"hello,world !");        map.put(3,"hello,java programe !");        for (Iterator it=map.keySet().iterator();it.hasNext();){            Object key=it.next();            Log.i(TAG,"link key : "+key.toString());        }        Log.i(TAG,"++++++++++++++++++++++++++++++++++++++++++++");        LinkedHashMap<Integer,String> linkmap=new LinkedHashMap<Integer, String>(LINKED_MAX,0.75f,false){            @Override            protected boolean removeEldestEntry(Entry<Integer, String> eldest) {                return this.size()>LINKED_MAX;//                return super.removeEldestEntry(eldest);            }        };        for (int i=0;i<12;i++){            linkmap.put(i,"i="+i);        }        for (Iterator it=linkmap.keySet().iterator();it.hasNext();){            Object key=it.next();            Log.i(TAG,"linkmap key : "+key.toString());        }        Log.i(TAG,"#########################################");        DurianLinkedHashMap<Integer,String> durianLinkedHashMap=new DurianLinkedHashMap<Integer, String>();        durianLinkedHashMap.setLINK_HASHMAP_MAX_SIZE(10);        for (int i=0;i<12;i++){            durianLinkedHashMap.put(i,"i = "+i);        }        for(Iterator it=durianLinkedHashMap.keySet().iterator();it.hasNext();){            Object key=it.next();            Log.i(TAG,"durianLinkedHashMap : "+key.toString());        }        Log.i(TAG,"durianLinkedHashMap MAX : "+durianLinkedHashMap.getLINK_HASHMAP_MAX_SIZE());        Log.i(TAG,"******************************************");        Map<Integer,String> hashmap=new HashMap<Integer, String>();        hashmap.put(5,"hello,zhibao.liu");        hashmap.put(8,"hello,world !");        hashmap.put(3,"hello,java programe !");        for (Iterator it=hashmap.keySet().iterator();it.hasNext();){            Object key=it.next();            Log.i(TAG,"hash key : "+key.toString());        }    }}
主要查看上面代码的一段如下:
protected boolean removeEldestEntry(Entry<Integer, String> eldest) {                return this.size()>LINKED_MAX;//                return super.removeEldestEntry(eldest);            }
这个返回值,如果返回的是false,LinkedHashMap将不会进行移除最先put进来的,当返回是true时,LinkedHashMap就会进行移除超出MAX size的部分,移除最先put进来的对象.
DurianLinkedHashMap.java
package org.durian.durianlrubitmap.util;import java.util.LinkedHashMap;import java.util.Map;/** * Project name : DurianLRUBitmap * Created by zhibao.liu on 2016/1/14. * Time : 13:46 * Email warden_sprite@foxmail.com * Action : durian */public class DurianLinkedHashMap<V,T> extends LinkedHashMap {    private int LINK_HASHMAP_MAX_SIZE=0;    public void setLINK_HASHMAP_MAX_SIZE(int max){        LINK_HASHMAP_MAX_SIZE=max>=0?max:0;    }    public int getLINK_HASHMAP_MAX_SIZE(){        return LINK_HASHMAP_MAX_SIZE;    };    @Override    protected boolean removeEldestEntry(Entry eldest) {//        return super.removeEldestEntry(eldest);        return this.size()>LINK_HASHMAP_MAX_SIZE;    }}
上面的这个条件可以自行设定,还可以增加其他判断条件来处理是否移除最先put进来的.
运行结果如下:




0 0
原创粉丝点击