HashMap + 软引用进行缓存,给2021的Java一些建议

这篇博客详细讲解了Java中的软引用概念,并通过代码示例展示了软引用与强引用的区别。在测试中,软引用能防止内存溢出,但加载的字符串数量少于强引用。文章还探讨了内存管理和垃圾回收机制。最后,作者提醒读者要广泛学习包括MySQL在内的各种技术,并提供了相关学习资料的领取方式。
摘要由CSDN通过智能技术生成
@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,真正的值

 *

 *           传入的queue,用于当Value被回收后,将 SoftNode对象放入 queue中,

 *           以便于表示 某 SoftNode对象中的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_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2d1b3J1aV9qYXZh,size_16,color_FFFFFF,t_70)



![](https://img-blog.csdnimg.cn/20210109113705974.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2d1b3J1aV9qYXZh,size_16,color_FFFFFF,t_70) 测试中可以明显的看到:



1.  强引用时,加载的String更多,但会造成内存溢出;

2.  弱引用时,由于弱引用的机制(内存满时会进行垃圾回收),不会造成内存溢出,但由于需要对String进行处理,所以加载的String没有强引用时多;




# 总结

在这里,由于面试中MySQL问的比较多,因此也就在此以MySQL为例为大家总结分享。但是你要学习的往往不止这一点,还有一些主流框架的使用,Spring源码的学习,Mybatis源码的学习等等都是需要掌握的,我也把这些知识点都整理起来了,有需要的朋友可以**[【转发+关注】后点击这里免费领取!](https://gitee.com/vip204888/java-p7)**

![面试真题](https://img-blog.csdnimg.cn/img_convert/23ceb5f8d8d05ba5d8f81d4b89976d3f.png)


Mybatis源码的学习等等都是需要掌握的,我也把这些知识点都整理起来了,有需要的朋友可以**[【转发+关注】后点击这里免费领取!](https://gitee.com/vip204888/java-p7)**

[外链图片转存中...(img-hVOpayLK-1628338992582)]


![Spring源码笔记](https://img-blog.csdnimg.cn/img_convert/85b25b0078d456e15f8c6a234c15f1a3.png)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值