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并不具备并发的功能。
相关文章推荐
- 20145231《Java程序设计》第二次实验报告
- 一个随时间不断变化的值确认其变化范围的方法
- Java classpath and directories
- Java开发中的23种设计模式详解(转)
- Java多线程学习
- java之路径分隔符介绍
- Java线程创建和启动
- java.net.UnknownHostException
- [转载]java正则表达式
- java基础---静态变量、静态块、非静态块、构造函数及静态方法总结及一点儿想法
- java一个方法形参有两个,如何在调用的时候只传入一个参数
- 个人学习-java-.isEmpty()
- Java动态代理
- Java读取文件
- Java算法---整数与IP地址间的转换
- JVM学习笔记三:JVM类加载机制
- java中的编码问题
- 深入分析 Java 中的中文编码问题
- 【LeetCode】299 Bulls and Cows (java实现)
- 递归算法 未名湖边的烦恼 java