WeakHashMap
WeakHashMap
      WeakHashMap 类的行为部分取决于垃圾回收器的动作
        因为垃圾回收器在任何时候都可能丢弃键
        WeakHashMap 就像是一个被悄悄移除条目的未知线程
      特别地
        即使对 WeakHashMap 实例进行同步，并且没有调用任何赋值方法
        即使程序员没有调用remove()或者clear()方法
          在一段时间后 size 方法也可能返回较小的值
      WeakHashMap 中的每个键对象间接地存储为一个弱引用的指示对象
      Entry继承了WeakReference类
        并且实例化Entry对象时
          所有的key都会通过调用super(key,queue)方法保存成对实际对象的弱引用
      HashMap和WeakHashMap的区别也在于此，HashMap的key是对实际对象的强引用
    弱引用（WeakReference）的特性
      当gc线程发现某个对象只有弱引用指向它，那么就会将其销毁并回收内存
      WeakReference也会被加入到引用队列queue中
    可能发生如下情况
      调用两次size()方法返回不同的值
      两次调用isEmpty()方法，第一次返回false，第二次返回true
      次调用containsKey()方法，第一次返回true，第二次返回false
        尽管两次使用的是同一个key
      两次调用get()方法，第一次返回一个value，第二次返回null
        尽管两次使用的是同一个对象。
    场景
      缓存