您的位置:首页 > 编程语言 > Java开发

Java项目源码学习笔记(一):IdentityCache

2016-04-16 11:44 741 查看
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并不具备并发的功能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: