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