import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Set;
public class IdentityCache<K, V>{
private final HashMap<K, Entry<K,V>> mWeakMap = new HashMap<K, Entry<K, V>>();
private ReferenceQueue<V> mQueue = new ReferenceQueue<V>();
public IdentityCache(){}
private static class Entry<K, V> extends WeakReference<V>{
K mKey;
public Entry(K key, V value, ReferenceQueue<V> queue){
super(value, queue);
mKey = key;
}
}
private void cleanUpWeakMap(){
Entry<K, V> entry = (Entry<K,V>)mQueue.poll();
while(entry != null){
mWeakMap.remove(entry.mKey);
entry = (Entry<K,V>)mQueue.poll();
}
}
public synchronized V put(K key, V value){
cleanUpWeakMap();
Entry<K, V> entry = mWeakMap.put(key, new Entry<K,V>(key, value, mQueue));
return entry == null ? null : entry.get();
}
public synchronized V get(K key){
cleanUpWeakMap();
Entry<K,V> entry = mWeakMap.get(key);
return entry == null ? null : entry.get();
}
public synchronized ArrayList<K> keys(){
Set<K> set = mWeakMap.keySet();
ArrayList<K> result = new ArrayList<K>(set);
return result;
}
}
简单分析一个类,我们看看它的变量和public方法,这二者基本决定了类的用途。
很显然,这是一个自定义容器类。它提供了一个容器变量和对外的接口put, get。
细节说明:
1. Entry:继承自WeakReference,封装容器要盛装的V对象,因此这个自定义容器类包括WeakReference的功能优势。而我们知道WeakReference对象本质内容是它封装的对象,这里是V。所以IdentityCache容器的功能就是——一个HashMap容器,同时容器盛放的对象具有WeakReference的功效。

2. synchronized:表明这是一个并发容器,普通的HashMap并不具备并发的功能。
原文:http://www.cnblogs.com/fordreamxin/p/5398012.html