JDK1.8源码逐字逐句带你理解WeakHashMap底层

引言

WeakHashMap其实也是java不常见的东西,但是和linkedHashMap一样,有它自己独特的功能。在本篇博文中我会用例子详细介绍它独有的属性,同时会对照源码来解释为什么它具备这样的功能。在知识点中会扩展关于引用的相关知识,帮助后面的理解。笔者目前整理的一些blog针对面试都是超高频出现的。大家可以点击链接:http://blog.csdn.net/u012403290

技术点

1、java中的引用
关于java中的引用,其实我在“GC-谈谈“生死””这篇文章中就详细介绍过引用的概念,从原来的粗犷定义到现在的定义(http://blog.csdn.net/u012403290/article/details/65698856)。引用类型主要分为4种:①强引用;②软引用;③弱引用;④虚引用。强引用就是永远不会回收掉被引用的对象,比如说我们代码中new出来的对象。软引用表示有用但是非必需的,如果系统内存资源紧张,可能就会被回收;弱引用表示非必需的对象,只能存活到下一次垃圾回收发生之前;虚引用是最弱的,这个引用无法操作对象。在java中有与之对应的对象:SoftReference(软引用), WeakReference(弱引用),PhantomReference(虚引用)。在我们今天要研究的WeakHashMap中用WeakReference来实现。

2、引用队列ReferenceQueue
根据本人的理解,引用队列就相当于一个电话簿一样的东西,用于监听和管理在引用对象中被回收的对象。具体我用一段代码来解释:

    Object o1 = new Object();Integer o2 = new Integer((int) o1);

比如说上面两段代码,在我们看来如果o2对象不被回收的话,o1永远都不可能被回收。但是在引用(Reference)中,存在这么一个情况:如果o1对象除了在o2中有引用之外没有别的地方存在引用,那么就可以回收o1。然后当这个o1被回收之后,我们就需要把o2放入引用队列中,所以引用队列(ReferenceQueue)就是Reference的监听器。在WeakHashMap中就是通过ReferenceQueue来反向处理map中的数据,如果对象被回收了,那么就需要把map中的对应数据移除。

一个例子

或许对于上面的介绍,很多人都看不懂的,接下来我先用HashMap建立一个例子帮大家理解:

package com.brickworkers;import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
import java.util.HashMap;
import java.util.Map;public class ReferenceTest {private static final int _1MB = 1024*1024;//设置大小为1MBpublic static void main(String[] args) throws InterruptedException {ReferenceQueue referenceQueue = new ReferenceQueue();//用引用队列进行监控引用的回收情况Object value = new Object();Map map = new HashMap();for (int i = 0; i < 100; i++) {//循环100次把数据插入到弱应用中(WeakReference), 同时把弱引用作为key存入HashMapbyte[] bytes = new byte[_1MB];//每个引用中都有关联引用队列(referenceQueue)的构造器,用引用队列监听回收情况//如此,那么每次WeakReference中的bytes被回收之后,那么这个weakReference对象就会放入引用队列WeakReference<byte[]> weakReference = new WeakReference<byte[]>(bytes, referenceQueue);map.put(weakReference, value);}Thread thread = new Thread(                        


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章