上一篇提到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 [email protected] * 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 [email protected] * 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进来的.
运行结果如下: