HashMap + 软引用进行缓存

弱引用:垃圾回收器一旦发现某块内存上只有弱引用(一定请注意只有弱引用,没强引用),不管当前内存空间是否足够,那么都会回收这块内存。

三、代码实例(强引用VS软引用)


现在的管理系统里,为了提升性能,往往会加入缓存,将部分常用的数据缓存到内存中,这样用于在访问时,会直接从内存中取出,降低数据库的访问量,加快用户获取数据的速度。将数据加入到hashmap中,如果内存空间足够,那么我们可以通过缓存来提升性能,但万一内存空间不够,我们可以依次释放一些内存,释放后不会影响业务流程,最多就是降低些性能。

对比一下,如果我们这里不用软应用,而是用强引用来缓存,由于不知道用户何时点击,我们还无法得知什么时候可以撤销这些对象上的强引用,或者即使我们引入了一套缓存淘汰流程,但这就是额外的工作了,这就没刚才使用“软引用“那样方便了。

1、软引用hashmap工具类

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

/**

  • queue,软引用标记队列

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

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

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

  • 以便于 temp 通过 key remove

*/

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);

// 如果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) {

clearQu
作者私人号:vip1024c
eue();

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 key,用于当 V 被回收后,temp 可以通过 key 进行移除

  • @param Value,真正的值

  •       传入的queue,用于当Value被回收后,将 SoftNode对象放入 queue中,
    
  •       以便于表示 某 SoftNode对象中的Value 已经被收回了。
    

*/

private class SoftNode<K, V> extends SoftReference {

K key;

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

super(v, queue);

key = k;

}

}

总结

这份面试题几乎包含了他在一年内遇到的所有面试题以及答案,甚至包括面试中的细节对话以及语录,可谓是细节到极致,甚至简历优化和怎么投简历更容易得到面试机会也包括在内!也包括教你怎么去获得一些大厂,比如阿里,腾讯的内推名额!

某位名人说过成功是靠99%的汗水和1%的机遇得到的,而你想获得那1%的机遇你首先就得付出99%的汗水!你只有朝着你的目标一步一步坚持不懈的走下去你才能有机会获得成功!

成功只会留给那些有准备的人!

录,可谓是细节到极致,甚至简历优化和怎么投简历更容易得到面试机会也包括在内!也包括教你怎么去获得一些大厂,比如阿里,腾讯的内推名额!

某位名人说过成功是靠99%的汗水和1%的机遇得到的,而你想获得那1%的机遇你首先就得付出99%的汗水!你只有朝着你的目标一步一步坚持不懈的走下去你才能有机会获得成功!

成功只会留给那些有准备的人!

[外链图片转存中…(img-CDJlpz4Z-1721048466607)]

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值