*/
private ReferenceQueue 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);