二、HashMap和WeakHashMap的区别

一、什么是?
对于Map的子类相信许多同学都有用过,面试题上也经常看到它的一些其他子类,比如、、啥的,以上这些子类估计有些同学在实际的开发中也用到过,但是我们这里说到的是,英文直译过来就是:虚弱的 。
从名字可以得知主要和有关,确实如此,功能几乎和一致 。不过还有一个Weak,聪明如你是不是想到了java.lang.ref包下的弱引用,我们就更能自然而然的想到这里面还牵扯到了一种弱引用结构,后面我们会有一篇文章简单介绍一下在JVM中弱引用的定义 。
二、和的区别
我们先看下和对象中的单个对象组成:

二、HashMap和WeakHashMap的区别

文章插图
【二、HashMap和WeakHashMap的区别】
二、HashMap和WeakHashMap的区别

文章插图

二、HashMap和WeakHashMap的区别

文章插图
上面两张图可以看到,.Entry和.Node的不同点在于,.Entry继承了,不太清楚的同学在这里给大家推荐一个篇文章: 如何理解强引用、软引用、弱引用、虚引用,那么我们在这里假设大家对都有深入的理解…好了,既然大家都已经知道弱引用的相关知识,我们都知道:
弱引用的生存期特别短,如果一个对象具有弱引用,在垃圾回收时候,一旦发现弱引用对象,无论当前内存空间是否充足,都会将弱引用回收 。
聪明如你是不是想到了一些特别恶心的场景:
1. 调用两次size()方法返回不同的值;第一次为10,第二次就为8了 。
2.两次调用()方法,第一次返回false,第二次返回true 。
二、HashMap和WeakHashMap的区别

文章插图
3.两次调用()方法,第一次返回true,第二次返回false 。
4.两次调用get()方法,第一次返回一个value,第二次返回null 。
还真有上面的问题,这种抓不到摸不着的对象是不是感觉没啥用,试想一下如果把你们功能需求里面的换成是不是会出现非常坑die的事情,是不是马上就想到了这样的对象能有什么用 。
四、使用场景
在如今的并发泛滥的大环境下,大家应该都用过缓存,缓存都是放在内存中的,而内存几乎是计算机中最宝贵也是最稀缺的资源,所以需要谨慎的使用,不然很容易就出现OOM 。缓存的主要作用是为了更快的处理业务、降低服务器的压力,那么我们就要保证缓存命中率,这里假设整个缓存是一个key-value结构的(以键值对缓存为例),作为强引用对象在没有主动将key删除是不会被JVM回收的,这样中的对象就会越积越多直到OOM错误;那么我们如何做到既让缓存的命中率高又不占用那么多的内存,我们这里就可以采用,当然不会有%的命中率(假设内存足够),但是在保证程序正常的前提下更好的实现了缓存这套解决方案 。
内部是通过弱引用来管理entry的,弱引用的特性对应到上意味着什么呢?将一对key, value放入到里并不能避免该key值被GC回收(除非在之外还有对该key的强引用),故内存问题也可以解决 。