软引用的集合
来源:互联网 发布:知名网络小说家 编辑:程序博客网 时间:2024/06/07 10:24
package com.xuti.increase.utils;import java.lang.ref.Reference;import java.lang.ref.ReferenceQueue;import java.lang.ref.SoftReference;import java.util.HashMap;import java.util.Map;/** * 软引用的集合 * * @author l * */public class SoftReferenceMap<K, V> extends HashMap<K, V> { // 核心工作:将强引用对象降低成软引用对象 private HashMap<K, MySoftValue<V>> temp; // 账本:装袋子的引用队列 private ReferenceQueue<V> queue; public SoftReferenceMap() { // Object o=new Object();// 占用内存多 // MySoftValue sr=new MySoftValue(o);// o的引用级别降低到软引用对象 // 工作内容 // ①MySoftValueMap的基本功能实现(put、get……) // ②清理空袋子 temp = new HashMap<K, MySoftValue<V>>(); queue=new ReferenceQueue<V>(); } @Override public V get(Object key) { clearNullMySoftValue(); MySoftValue<V> sr = temp.get(key);// 获取袋子 if (sr != null) { // 垃圾回收器清除,则此方法将返回 null return sr.get(); } return null; } @Override public V put(K key, V value) { MySoftValue<V> sr = new MySoftValue<V>(key,value,queue); temp.put(key, sr); return null; } @Override public boolean containsKey(Object key) { clearNullMySoftValue(); // temp.containsKey(key):是否含有袋子 MySoftValue<V> sr = temp.get(key); if(sr!=null) {// return sr.get()!=null; if(sr.get()!=null) { return true; } } return false; } /** * 清理空袋子 */ private void clearNullMySoftValue() { // 目标:发现谁是空袋子 // 方式一:循环temp集合,发现value没有手机,清理 /** * for(Map.Entry item:temp.entrySet()) * { * item.getValue().get(); * } */ // 在内存内存充足的时候,有一定的几率会有误删除,循环==无用功 // 方式二:除了temp集合清楚谁是空袋子外,还有谁清楚? // 谁回收的谁清楚 // 交给一个GC一个"账本",GC在回收对象的时候,记录一下把那个袋子的手机给回收了 // 查账 // 如果存在"一个"立即可用的对象,则从该队列中"移除"此对象并返回。否则此方法立即返回"null"。 MySoftValue<V> sr = (MySoftValue<V>) queue.poll(); while(sr!=null) { // 删除空袋子 temp.remove(sr.key); sr = (MySoftValue<V>) queue.poll(); } } /** * 加强版的袋子,多了key * @author l * */ private class MySoftValue<T> extends SoftReference<T>{ Object key; public MySoftValue(Object key,T referent, ReferenceQueue<? super T> q) { super(referent, q); this.key = key; } } }
0 0
- 软引用的集合
- 弱引用的集合类
- 集合只是持有对象的引用
- 弱引用,软引用,幽灵的引用
- 强引用 软引用 弱引用 虚引用的区别
- 强引用,软引用,弱引用,虚引用的区别
- Java的强引用、软引用、弱引用、虚引用
- 强引用,软引用,弱引用,虚引用的使用
- 强引用,软引用,弱引用,虚引用的对比
- java的强引用,软引用,弱引用,虚引用
- 强引用、弱引用、软引用、虚引用的理解
- java的强引用、软引用、弱引用、虚引用
- Spring注入集合引用
- 数组变量存储值,报引用未初始化的集合
- 集合存放的是对象还是对象引用?
- spirng配置独立的集合bean,以供多个bean引用
- 添加一个对象到集合中时,集合里面存放的是对象的引用
- 怎么把一个集合的数据复制到另一个集合 不是引用传递(地址传递)
- NDK 配置错误arm-linux-androideabi-gcc: error: CreateProcess: No such file or directory
- 【智力题】拿硬币(数数字)、游戏
- HTML把内容居中怎么弄
- Android CardView 开发过程中要注意的细节
- JavaScript 中定义函数时用 var foo = function () {} 和 function foo() 的区别
- 软引用的集合
- EtherCAT之对象字典解析
- 更简单的非递归遍历二叉树的方法
- 期末考试-最大公约数(算法基础 第10周)
- 云主机上部署兔子TuziCMS系统图文教程
- Retrofit源码分析以及MVP框架封装使用
- JS一般般的网页重构可以使用Node.js做些什么
- 对通用输入输出GPIO的深入理解
- eclipse的svn插件连接osc的代码仓库时候报错的解决办法