美文网首页
体验WeakHashMap

体验WeakHashMap

作者: lenny611 | 来源:发表于2019-08-11 16:11 被阅读0次

先上代码:

import java.util.Map;
import  java.util.WeakHashMap;
public class MyWeakHashMap {
    public static void main(String[] args) {
        Map<String, Integer> map = new WeakHashMap<>();
        map.put(new String("1"), 1);
        map.put(new String("2"),2 );
        map.put(new String("3"),3 );
        map.put("6",6);
        String key = null;
        for (String s : map.keySet()) {
        // 这个"3"和new String("3")不是一个引用
            if (s.equals("3")) {
                key = s;
            }
        }
        System.out.println("第一次打印"+map);
        System.gc();
        //取消清除掉1 2,3存活是因为3与key这个强引用挂钩,6存活是因为6存在于字符串常量池
        map.put(new String("4"),4);
        System.out.println("第二次打印"+map);
        //key与3的引用断裂,再GC则3也会被回收
        key = null;
        System.gc();
        System.out.println("第三次打印"+map);
    }
}

结果如下:


运行结果图.png

解释如下:
第一次GC,即第二次打印的结果为上图是因为 1 2 是弱引用 ;而3没有消失是因为 key这个强引用与3挂钩,所以没有被GC掉;
第二次GC,即第三次打印的结果,是因为key=null,即key与3的引用断裂,所以3被GC掉,4被GC的原因与第一次一致,在这里就不解释了;

答主有点懵逼的地方就是:1 2 4明明是new String出来的,为什么会被GC?
后来答主明白了,在解释这个问题之前,我们先来补充一些知识:
JDK1.2后对引用进行了扩充,四种引用如下:
(1)强引用
使用最普遍的引用。如果一个对象具有强引用,它绝对不会被gc回收。如果内存空间不足了,gc宁愿抛出OutOfMemoryError,也不是会回收具有强引用的对象。
(2)软引用(SoftReference)
如果一个对象只具有软引用,则内存空间足够时不会回收它,但内存空间不够时就会回收这部分对象。只要这个具有软引用对象没有被回收,程序就可以正常使用。
(3)弱引用(WeakReference)
如果一个对象只具有弱引用,则不管内存空间够不够,当gc扫描到它时就会回收它。
(4)虚引用(PhantomReference)
如果一个对象只具有虚引用,那么它就和没有任何引用一样,任何时候都可能被gc回收。

然后我们来看WeakHashMap的小部分源码:

    /**
     * The entries in this hash table extend WeakReference, using its main ref
     * field as the key.
     */
    private static class Entry<K,V> extends WeakReference<Object> implements Map.Entry<K,V> {
        V value;
        final int hash;
        Entry<K,V> next;
        /**
         * Creates new entry.
         */
        Entry(Object key, V value,
              ReferenceQueue<Object> queue,
              int hash, Entry<K,V> next) {
            super(key, queue);
            this.value = value;
            this.hash  = hash;
            this.next  = next;
        }

从Entry的构造方法我们知道,key最终会传到到Reference的构造方法中,但是我们更需要注意的是,Entry继承了WeakReference这个类,也就是上文提到的弱引用,再结合上文”如果一个对象只具有弱引用,则不管内存空间够不够,当gc扫描到它时就会回收它。”
似乎还是没解决“ 1 2 4明明是new String出来的,为什么会被GC ”这个问题,但是我们思考这样一个问题,虽然这个对象是new出来的,但是如果这个对象同时也继承了WeakReference,即与弱引用挂钩,那这个对象到底是属于强引用还是弱引用呢?

答主先回答“ 1 2 4明明是new String出来的,为什么会被GC ”这个问题,
虽然是new出来的对象,但是new的引用 在传递参数之后就丢失了,而与它继承的WeakReference挂上了钩,所以属于弱引用对象,GC的时候,会被回收。

相关文章

  • 体验WeakHashMap

    先上代码: 结果如下: 解释如下:第一次GC,即第二次打印的结果为上图是因为 1 2 是弱引用 ;而3没有消失是因...

  • WeakHashMap源码分析

    WeakHashMap WeakHashMap介绍 WeakHashMap继承于AbstractMap,实现了Ma...

  • WeakReference 在 WeakHashMap 和 T

    WeakHashMap TheadLocalMap WeakHashMap 和 ThreadLocalMap 中 ...

  • Java开发大型互联网-探索WeakHashMap垃圾回收原理你

    WeakHashMap垃圾回收原理 垃圾回收原理 谈WeakHashMap回收原理得从WeakReference(...

  • Java集合·09·WeakHashMap详解

    一、概述 WeakHashMap 继承于AbstractMap,实现了Map接口。 WeakHashMap也是一个...

  • WeakHashMap 解析

    WeakHashMap WeakHashMap和HashMap一样key和value的值都可以为null,并且也是...

  • WeakHashmap

    近日阅读 hadoop 源码时,经常就遇到一个集合 WeakHashmap,阅读源码,发现jdk1.2就出现了这个...

  • WeakHashMap

    WeakHashMap 总体介绍 在Java集合框架系列文章的最后,笔者打算介绍一个特殊的成员:WeakHashM...

  • WeakHashMap

    一、什么是WeakHashMap? Map 的子类常见的有 HashMap[https://www.jianshu...

  • WeakHashMap

    1. 简介 WeakHashMap 是一种使用弱项(WeakEntry)的哈希映射表,本质上是一种特殊的HashM...

网友评论

      本文标题:体验WeakHashMap

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