Android(安卓)增强版HashMap,使用软引用
16lz
2021-01-24
说明:
1)创建个HashMap
/** * 软引用的map集合 * * @author chenlin * * @param <K> * @param <V> */public class SoftMap<K, V> extends HashMap<K, V> { // 降低对象的引用界别——V /** * */ private static final long serialVersionUID = 1L; private HashMap<K, SoftValue<K, V>> temp;// 存放袋子的集合 private ReferenceQueue<V> queue; public SoftMap() { // Object v=new Object();//占用内存较多 // SoftReference sr=new SoftReference(v);//v的引用级别被降低了 // 第一步:将占用内存较多的手机,添加到袋子中 // 第二步:手机被GC回收,清理空袋子 temp = new HashMap<K, SoftValue<K, V>>(); queue = new ReferenceQueue<V>();// 但凡装V的袋子,都可以放到该集合中 } @Override public V put(K key, V value) { // SoftReference<V> sr = new SoftReference<V>(value);// 将手机装到袋子中 // SoftReference(T referent, ReferenceQueue<? super T> q) // 记录回收掉的袋子引用ReferenceQueue SoftValue<K, V> sr = new SoftValue<K, V>(key, value, queue); temp.put(key, sr); return null; } @Override public V get(Object key) { clearDatas(); SoftValue<K, V> sr = temp.get(key); if (sr != null) { // 垃圾回收器清除,则此方法将返回 null。 return sr.get(); } return null; } @Override public boolean containsKey(Object key) { // 什么叫真正的contain // temp.containsKey(key); /* * if(get(key)!=null) { return true; }else{ return false; } */ return get(key) != null; } /** * 清理空袋子 */ @SuppressWarnings("unchecked") private void clearDatas() { // 方式一:循环temp,逐一判断是否有手机,存在问题:如果当前内存够用,循环无用 // 方式二:GC知道把那个袋子的手机给回收了,利用GC,让其记录曾经被偷的手机(存入到集合中) // 如果能够控制该集合,再循环该集合,里面存放的一定被回收了 // 轮询此队列,查看是否存在可用的引用对象。 // 如果存在一个立即可用的对象,则从该队列中"移除"此对象并返回。 // 否则此方法立即返回 null。 SoftValue<K, V> poll = (SoftValue<K, V>) queue.poll(); while (poll != null) { temp.remove(poll.key); poll = (SoftValue<K, V>) queue.poll(); } } /** * 增强版的袋子,增加了key,方便清理操作 * * @author Administrator * * @param <K> * @param <V> */ @SuppressWarnings("hiding") private class SoftValue<K, V> extends SoftReference<V> { private Object key; public SoftValue(K key, V r, ReferenceQueue<? super V> q) { super(r, q); this.key = key; } }}
使用方法:与hashmap的使用方法一致
SoftMap<key,value> sm = new SoftMap<key,value>();sm.put(key,value);sm.get(key);boolean sm.containsKey(key);
更多相关文章
- Android(安卓)实时视频采集—Cameara预览采集
- get方式和post方式的请求
- android利用Serialization向服务器端发送任意的文件(二)
- 用Socket实现PC和手机的文件传输
- Android实现自动轮播图效果
- Android中实现输入图片地址浏览图片操作
- 【Android小经验】 ListView列中的一个ITEM值
- Android(java)学习笔记63:线程的调度
- Android(安卓)Runnable 用法