美文网首页
WeakHashMap

WeakHashMap

作者: Djbfifjd | 来源:发表于2020-06-18 21:57 被阅读0次

一、什么是WeakHashMap?

Map 的子类常见的有 HashMapHashtable、ConcurrentHashMap、LinkedHashMap 等。WeakHashMap,英文直译过来就是:虚弱的 HashMap。从名字可以得知主要和 HashMap 有关,确实如此,WeakHashMap 功能几乎和 HashMap 一致。Weak,联想java.lang.ref包下的弱引用 WeakReference,由此这里面还牵扯到了一种弱引用结构。

二、HashMap和WeakHashMap的区别

先看下 WeakHashMap 和 HashMap 对象中的单个对象组成:

WeakHashMap.Entry 和 HashMap.Node 的不同点在于,WeakHashMap.Entry 继承了WeakReference

弱引用的生存期特别短,如果一个对象具有弱引用,在垃圾回收时候,一旦发现弱引用对象,无论当前内存空间是否充足,都会将弱引用回收。

想象一下如下场景:

  1. 调用两次 size() 返回不同的值;第一次为 10,第二次就为 8 了。
  2. 两次调用 isEmpty(),第一次返回 false,第二次返回 true。
  3. 两次调用 containsKey(),第一次返回 true,第二次返回 false。
  4. 两次调用 get(),第一次返回一个 value,第二次返回 null。

三、使用场景

在如今的并发泛滥的大环境下,大家应该都用过缓存,缓存都是放在内存中的,而内存几乎是计算机中最宝贵也是最稀缺的资源,所以需要谨慎的使用,不然很容易就出现 OOM。缓存的主要作用是为了更快的处理业务、降低服务器的压力,那么就要保证缓存命中率,这里假设整个缓存是一个key-value结构的(以键值对缓存为例),HashMap作为强引用对象在没有主动将key删除是不会被JVM回收的,这样HashMap中的对象就会越积越多直到OOM错误;那么我们如何做到既让缓存的命中率高又不占用那么多的内存,我们这里就可以采用WeakHashMap,当然不会有HashMap100%的命中率(假设内存足够),但是在保证程序正常的前提下更好的实现了缓存这套解决方案。
  WeakHashMap内部是通过弱引用来管理entry的,弱引用的特性对应到 WeakHashMap 上意味着什么呢?将一对key, value放入到 WeakHashMap 里并不能避免该key值被GC回收(除非在 WeakHashMap 之外还有对该key的强引用),故内存问题也可以解决。

相关文章

网友评论

      本文标题:WeakHashMap

      本文链接:https://www.haomeiwen.com/subject/tdupxktx.html