写点什么

HashMap + 软引用进行缓存,java 程序设计案例教程第二版答案

作者:Java高工P7
  • 2021 年 11 月 09 日
  • 本文字数:1137 字

    阅读完需:约 4 分钟

public class SoftHashMap<K, V> extends HashMap<K, V> {


/**


  • queue,软引用标记队列

  • <p>

  • ★★★★★★★ 解释 ★★★★★★★

  • 当 SoftNode 中 Value 被回收时,SoftNode 对象会被放入 queue 中,以表示当前 SoftNode 中的 Value 不存在

  • 对我们的使用好处就是,我们读取 queue 队列,取出 SoftNode 对象,取出其内部的 Key

  • 以便于 temp 通过 key remove


*/


private ReferenceQueue<V> queue;


/**


  • 真正的 map 对象

  • 1、temp 内部 封装的 Node 强引用 K 和 SoftNode

  • 2、SoftNode 内部强引用 K,弱引用真正的 Value


*/


private HashMap<K, SoftNode<K, V>> temp;


public SoftHashMap() {


queue = new ReferenceQueue<>();


temp = new HashMap<>();


}


@Override


public V get(Object key) {


clearQueue();


// 通过 key 进行取值,如果为 null,返回 null,否则返回 SoftNode 软引用的值


SoftNode softNode = temp.get(key);


return softNode == null ? null : (V) softNode.get();


}


@Override


public V put(K key, V value) {


clearQueue();


// 创建 SoftNode 对象


SoftNode softNode = new SoftNode(key, value, queue);


// 返回 key 之前所对应的 SoftNode 对象,即 oldSoftNode


SoftNode oldSoftNode = temp.put(key, softNode);


// 如果 oldSoftNode 为 null,就返回 null,否则就返回 oldSoftNode 所软引用的 Value


return oldSoftNode == null ? null : (V) oldSoftNode.get();


}


@Override


public boolean containsKey(Object key) {


clearQueue();


return temp.containsKey(key);


}


@Override


public V remove(Object key) {


clearQueue();


SoftNode<K, V> remove = temp.remove(key);


return remove == null ? null : remove.get();


}


@Override


public int size() {


clearQueue();


return temp.size();


}


/**


  • 通过软引用队列内的 SoftNode,获取 Key,然后 temp 清除此 Key

  • @see ReferenceQueue poll()

  • poll() -- 类似于 stack 的 pop(),移除并返回此对象


*/


private void clearQueue() {


SoftNode poll;


while ((poll = (SoftNode) queue.poll()) != null) {


temp.remove(poll.key);


}


}


/**


  • 对 V 进行软引用的类

  • @param <K> key,用于当 V 被回收后,temp 可以通过 key 进行移除

  • @param <V> Value,真正的值


*/


private class SoftNode<K, V> extends SoftReference<V> {


K key;


public SoftNode(K k, V v, ReferenceQueue queue) {


super(v, queue);


key = k;


}


}


}

2、强引用与软引用的测试对比:

![](https://img-blog.csdnimg.cn/20210109113651280.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVp


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


dGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2d1b3J1aV9qYXZh,size_16,color_FFFFFF,t_70)



?测试中可以明显的看到:

用户头像

Java高工P7

关注

还未添加个人签名 2021.11.08 加入

还未添加个人简介

评论

发布
暂无评论
HashMap + 软引用进行缓存,java程序设计案例教程第二版答案