结构
java-collection-WeakHashMap

特点
基于哈希表的映射接口的实现, WeakHashMap 中的entry 将自动删除,它的键不再是普通用途,
更确切地说,一个映射的存在给一个指定的key不会阻止key被GC回收,被finalized finalized 然后被回收。当一个key被丢弃,它的entry是有效的被移除 从map中,所以它的类的行为与其他Map实现略有不同。

null值和nullkey 均被支持,这个类与HashMap有相似的性能特征。具有相同的效率参数 初始容量和负载因子。

同步
像大多数集合类一样,这个类不同步。可以使用{@link Collections#synchronizedMap Collections.synchronizedMap}构造一个同步的WeakHashMap

这个类主要用于与键对象的equlas方法测试对象的身份用==算子。一旦这样的key被丢弃,它就永远不会被创建,因此不可能去找那个key 在WeakHashMap在迟一些的时候,对它的entry被移除感到惊讶。
这个类与key对象完美结合,key对象的equals不会基于oject id 例如String实例。使用这些可重新创建的key对象,然而,自动删除WeakHashMap 条目,被丢弃的keys可能会被混淆。

该类的行为部分取决于GC的动作,所以几个熟悉(虽然不要去)Map不变量对这个类不成立。
因为GC可以随时丢弃key WeakHashMap可能表现为一个未知的线程在无声的删除条目。
特别 即使您在同步WeakHashMap实例 不调用它的任何变体方法,他可能使用size方法返回较小的值
isEmpty方法 返回false 然后返回true containskey 返回true 然后返回falseget方法返回key的值 然后返回null
put 方法 返回null 然后remove方法 返回false 对一个先前存在的key 然后连续的测试keySet 值集合 然后entrySet 被设置
产生连续较小的数量的元素
每个key在WeakHashMap 中被直接存储作为弱引用。
因此key将自动被移除仅当弱引用,无论是在内部还是在外部map,已被垃圾回收器清除

值对象在WeakHashMap由普遍的强引用持有。因此关心应确保值对象不强烈地直接或间接引用它们的对象。它将会阻止keys被丢弃。注意,一个值对象可以间接应用key通过WeakHashMap 一个值对象可以强引用对其他的key对象 关联值对象,强引用对这个key的第一个值对象 。如果值不再依赖map持有他们的强引用,一种方式处理这个是包装值用WeakReferences 在插入之后
例如m.put(key, new WeakReference(value))
然后unwrapping 每次get

迭代器
由该类的“集合视图方法”返回的迭代器是fail-fast的,如果map结构在iterator创建后被修改,在任何方式除了通过迭代器自己的remove方法,迭代器将会抛出一个ConcurrentModificationException异常,
因此,面对并发修改,迭代器快速而干净地失败,而不是冒险,在未来不确定时间内的任意的、非确定性的行为。

迭代器的故障快速行为不能得到保证,事实上,一般来说,不可能作出任何硬的保证,存在不同步的并发修改。故障快速迭代器在尽力的基础上抛出ConcurrentModificationException、
*因此,编写一个依赖于此异常正确性的程序是错误的。迭代器的fail-fast行为只用于检测缺陷。

ReferenceQueue

java-collection-WeakHashMap

参考资料:
https://www.cnblogs.com/xdouby/p/6793184.html
https://www.cnblogs.com/skywang12345/p/3311092.html
http://www.codeceo.com/article/java-weakhashmap-source.html#0-tsina-1-91909-397232819ff9a47a7b7e80a40613cfe1

相关文章: