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并不具备并发的功能。