• weakHashMap 用法


    WeakHashMap,此种Map的特点是:

    当除了自身有对key的引用外,此key没有其他引用,那么GC之后此map会自动丢弃此值

    当使用 WeakHashMap 时,即使没有显示的添加或删除任何元素,也可能发生如下情况:

    • 调用两次size()方法返回不同的值;
    • 两次调用isEmpty()方法,第一次返回false,第二次返回true;
    • 两次调用containsKey()方法,第一次返回true,第二次返回false,尽管两次使用的是同一个key;
    • 两次调用get()方法,第一次返回一个value,第二次返回null,尽管两次使用的是同一个对象。

    举例来说:声明了两个Map对象,一个是HashMap,一个是WeakHashMap,同时向两个map中放入a、b两个对象,当HashMap remove掉a 并且将a、b都指向null时,WeakHashMap中的a将自动被回收掉。出现这个状况的原因是,对于a对象而言,当HashMap remove掉并且将a指向null后,除了WeakHashMap中还保存a外已经没有指向a的指针了,所以WeakHashMap会自动舍弃掉a,而对于b对象虽然指向了null,但HashMap中还有指向b的指针,所以WeakHashMap将会保留。

    public class Weakmap {  
              public static void main(String[] args) throws Exception {  
                String a = new String("a");  
                String b = new String("b");  
                Map weakmap = new WeakHashMap();  
                Map map = new HashMap();  
                map.put(a, "aaa");  
                map.put(b, "bbb");  
    
                weakmap.put(a, "aaa");  
                weakmap.put(b, "bbb");  
    
                map.remove(a);  
    
                a=null;
                b=null;  
    
                System.gc();  
                Iterator i = map.entrySet().iterator();  
                while (i.hasNext()) {  
                    Map.Entry en = (Map.Entry)i.next();  
                    System.out.println("map:"+en.getKey()+":"+en.getValue());  
                }  
    
                Iterator j = weakmap.entrySet().iterator();  
                while (j.hasNext()) {  
                    Map.Entry en = (Map.Entry)j.next();  
                    System.out.println("weakmap:"+en.getKey()+":"+en.getValue());    
                }  
            }   
    

    弱引用(WeakReference)。我们都知道Java中内存是通过GC自动管理的,GC会在程序运行过程中自动判断哪些对象是可以被回收的,并在合适的时机进行内存释放。GC判断某个对象是否可被回收的依据是,是否有有效的引用指向该对象。如果没有有效引用指向该对象(基本意味着不存在访问该对象的方式),那么该对象就是可回收的。这里的“有效引用”并不包括弱引用。也就是说,虽然弱引用可以用来访问对象,但进行垃圾回收时弱引用并不会被考虑在内,仅有弱引用指向的对象仍然会被GC回收。

    WeakHashMap 内部是通过弱引用来管理entry的,弱引用的特性对应到 WeakHashMap 上意味着什么呢?将一对key, value放入到 WeakHashMap 里并不能避免该key值被GC回收,除非在 WeakHashMap 之外还有对该key的强引用。

  • 相关阅读:
    BZOJ2457 双端队列 题解
    POJ1723,1050,HDU4864题解(贪心)
    Splay与FHQ-Treap
    POJ3179 Corral the Cows题解
    使用easypoi根据表头信息动态导出excel
    Spring @Configuration注解
    vue脚手架vue-cli的搭建
    使用poi导出excel
    mybatis中的一对多和多对一
    angularjs模态框的使用
  • 原文地址:https://www.cnblogs.com/gmhappy/p/11864004.html
Copyright © 2020-2023  润新知