WeakHashMap的使用

HashMap相信大家都知道,而且应用得非常熟练,但是WeakHashMap不知道有多少人用过,是怎么使用的。最近在看源码的时候发现了WeakHashMap,就想看看这个到底和HashMap有什么不同。

public class WeakHashMap
    extends AbstractMap
    implements Map

public class HashMap extends AbstractMap
    implements Map, Cloneable, Serializable

HashMap比WeakHashMap多实现了Cloneable和Serializable,HashMap让开发者能够去做序列化和反序列化的操作,即可用作为和数据库进行交换的对象。分析WeakHashMap的源码知道它采用的是弱引用的Entry进行存储键值对。

/**
     * The entries in this hash table extend WeakReference, using its main ref
     * field as the key.
     */
    private static class Entry extends WeakReference implements Map.Entry 
  
那么弱引用关系和强引用关系到底有什么不同呢?看下面代码

public static void main(String[] args) { 
        Map weakHashMap = new WeakHashMap();
        
        Thread thread1 = new Thread();
        Thread thread2 = new Thread();
        weakHashMap.put(thread1, "thread1");
        weakHashMap.put(thread2, "thread2");
        thread1 = null;
        System.gc();
        
        for(Entry entry:weakHashMap.entrySet()){
        	System.out.println(entry.getValue());
        }
        
        Map hashMap = new HashMap();
        
        Thread thread3 = new Thread();
        Thread thread4 = new Thread();
        hashMap.put(thread3, "thread3");
        hashMap.put(thread4, "thread4");
        thread3 = null;
        System.gc();
        
        for(Entry entry:hashMap.entrySet()){
        	System.out.println(entry.getValue());
        }
    }

这里我主动的用垃圾回收进行了处理,得出的结果是:

thread2
thread4
thread3

可以看出WeakHashMap中的thread1被垃圾回收了。但是HashMap的thread3却没有回收。弱引用关系当垃圾回收发生的时候,如果键为null那么就会被回收。


你可能感兴趣的:(Java)