Java中的WeakHashMap简析
一、什么是 WeakHashMap
Map 的子类常见的有 HashMap、Hashtable、ConcurrentHashMap、LinkedHashMap 等。
WeakHashMap,直译就是:虚弱的 HashMap。
从名字可得知其和 HashMap 有关,确实如此,WeakHashMap 功能几乎和 HashMap 一致。
Weak,联想java.lang.ref包下的弱引用(WeakReference),由此这里面还牵扯到了一种弱引用结构。
二、HashMap 和 WeakHashMap 的区别
先看下 WeakHashMap 和 HashMap 中单个对象的组成:

WeakHashMap.Entry 和 HashMap.Node 的不同点在于,WeakHashMap.Entry 继承了WeakReference。
弱引用的生存期特别短。垃圾回收的时候,一旦发现弱引用对象,无论当前内存空间是否充足,都会将弱引用回收。
想象一下如下场景:
- 调用两次 size():第一次为 10,第二次就为 8 了。
- 两次调用 isEmpty():第一次返回 false,第二次返回 true。
- 两次调用 containsKey():第一次返回 true,第二次返回 false。
- 两次调用 get():第一次返回一个 value,第二次返回 null。
三、使用场景
在如今的并发泛滥的大环境下,大家应该都用过缓存,缓存都是放在内存中的,而内存几乎是计算机中最宝贵也是最稀缺的资源,所以需要谨慎的使用,不然很容易就出现 OOM。
缓存的主要作用是为了更快的处理业务、降低服务器的压力,那么就要保证缓存命中率,这里假设整个缓存是一个 key-value 结构的(以键值对缓存为例),HashMap 作为强引用对象在没有主动将 key 删除时是不会被 JVM 回收的,这样 HashMap 中的对象就会越积越多直到 OOM 错误;
那么如何做到既让缓存的命中率高又不占用那么多的内存,这里就可以采用 WeakHashMap,当然不会有 HashMap 100% 的命中率(假设内存足够),但是在保证程序正常的前提下更好的实现了缓存这套解决方案。
WeakHashMap 内部是通过弱引用来管理 Entry 的,弱引用的特性对应到 WeakHashMap 上意味着什么呢?
将一对 key-value 放入到 WeakHashMap 里并不能避免该 key 值被 GC 回收(除非在 WeakHashMap 之外还有对该 key 的强引用),故内存问题也可以解决。
到此这篇关于Java中的WeakHashMap简析的文章就介绍到这了,更多相关Java的WeakHashMap内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
关于break和continue以及label的区别和作用(详解)
下面小编就为大家带来一篇关于break和continue以及label的区别和作用(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧2017-05-05
Java如何将任意类型的Object对象转换为相应的实体对象
这篇文章主要介绍了Java如何将任意类型的Object对象转换为相应的实体对象问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2024-01-01
Java8 Stream对两个 List 遍历匹配数据的优化处理操作
这篇文章主要介绍了Java8 Stream对两个 List 遍历匹配数据的优化处理操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2020-08-08
idea快捷键生成getter和setter,有构造参数,无构造参数,重写toString方式
这篇文章主要介绍了java之idea快捷键生成getter和setter,有构造参数,无构造参数,重写toString方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2023-11-11


最新评论