HashMap + 软引用进行缓存,java 程序设计案例教程第二版答案
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
dGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2d1b3J1aV9qYXZh,size_16,color_FFFFFF,t_70)
?测试中可以明显的看到:
评论