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

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

posted on 2016-04-16 11:44  Matrixin  阅读(357)  评论(0编辑  收藏  举报

导航