降低对象的引用级别到软引用 class SoftValueMap<K, V> extends HashMap<K, V>
来源:互联网 发布:飞鹰网络电视手机版 编辑:程序博客网 时间:2024/05/22 02:26
/** * 降低对象的引用级别到软引用 * * @author Administrator * * @param <K> * @param <V> */public class SoftValueMap<K, V> extends HashMap<K, V> {// 降低V的引用级别到软引用private HashMap<K, SoftValue<K, V>> temp;private ReferenceQueue<V> queue;// 装破袋子(放置手机V)public SoftValueMap() {// 软引用// Object v=new Object();//占用内存多// SoftReference sr=new SoftReference(v);// 降低了v的引用界别// ①将手机(占用内存较多的对象)添加到袋子(SoftReference)里面// ②一旦手机被偷了,将破袋子回收temp = new HashMap<K, SoftValue<K, V>>();queue = new ReferenceQueue<V>();}@Overridepublic V put(K key, V value) {// SoftValue<K,V> sr = new SoftValue<K,V>(value);// 当GC在回收手机时候,会将sr添加到queueSoftValue<K, V> sr = new SoftValue<K, V>(value, key, queue);// 将sr与queue绑定temp.put(key, sr);return null;}@Overridepublic V get(Object key) {clearSR();SoftValue<K, V> sr = temp.get(key);if (sr != null) {// 如果此引用对象已经由程序或垃圾回收器清除,则此方法将返回 null。return sr.get();} else {return null;}}@Overridepublic boolean containsKey(Object key) {clearSR();// 什么才叫含有// 获取到袋子,从袋子里面拿到手机了,含有SoftValue<K, V> sr = temp.get(key);// temp.containsKey(key);/* * if(sr.get()!=null) { return true; }else{ return false; } */if (sr != null) {return sr.get() != null;}return false;}/** * 清理被回收掉手机的破袋子 */private void clearSR() {// 方案一:循环一下temp,如果被回收掉了,清理出temp// 内存如果内存还能够满足:temp不会有元素被回收// 方案二:如果GC把手机回收,将破袋子的引用记录到一个(自己创建)集合中// (自己创建)集合// 如果存在一个立即可用的对象,则从该队列中"移除"此对象并返回。否则此方法立即返回 null。SoftValue<K, V> poll = (SoftValue<K, V>) queue.poll();while (poll != null) {// 从temp将sr强引用对象清除temp.remove(poll.key);poll = (SoftValue<K, V>) queue.poll();}}@Overridepublic void clear() {temp.clear();}/** * 加强版的袋子,存储了一下key信息 * * @author Administrator * * @param <K> * @param <V> */private class SoftValue<K, V> extends SoftReference<V> {private Object key;public SoftValue(V r, Object key, ReferenceQueue<? super V> q) {super(r, q);this.key = key;}}}
0 0
- 降低对象的引用级别到软引用 class SoftValueMap<K, V> extends HashMap<K, V>
- 【源码分析】HashMap的put(K k,V v)方法
- HashMap<K, V>泛型类
- HashMap<K, V>泛型类
- HashMap<K, V>泛型类
- HashMap<K, V>泛型类
- HashMap<K,V>详解
- java.util.HashMap<K,V>
- Class RedisTemplate<K,V> ------ API
- Java集合Map<K,V>,HashMap<K,V>的使用,for循环正解
- Map<K,V>接口及其子类HashMap的基本使用和其两种遍历方法(如何保证键为引用类型的唯一性)
- Java集合之Hashtable<K,V>,TreeMap<K,V>,HashMap<K,V>自动排序
- 类 Hashtable<K,V>及与HashMap的区别
- HashMap put(K key, V value)解析
- hashMap--put(k,v)源码分析
- 遍历Map<k,v> k,v的几种方法
- Map<K,V>的使用
- LinkedHashMap<K,V>的用法
- [Dev]DevExpress之treelist右键菜单实现
- ORA-09817错误
- java中fianl的使用
- 限制文本框只能输入数字
- 本文只为记录,自学 CAAnaimation 中正在学习中...
- 降低对象的引用级别到软引用 class SoftValueMap<K, V> extends HashMap<K, V>
- ecshop中自定义页面的分页实现使用ecs自带分页程序
- RPC原理详解
- Java-day02基础语法
- SOUI GDI+渲染引擎下的字体特效
- C语言使用回调函数解决内存申请和释放的问题
- 20个数据库设计最佳实践
- NGUI制作字体的三种方法
- 二维数组中的查找