因此,JavaWeakHashMap
允许创建一个映射,如果其键变弱,则删除其条目。但是,当地图中的值变弱时,如何创建一个其条目被删除的地图?我想使用地图的原因是作为一个全局哈希表,它根据对象的 ID 跟踪对象。
ID ---> Object Address
Key ---> Value
(文本字符串在哪里ID
)
我希望在对象地址变弱时删除键值对,而不是指向它们的字符串。有人对此有任何想法吗?
因此,JavaWeakHashMap
允许创建一个映射,如果其键变弱,则删除其条目。但是,当地图中的值变弱时,如何创建一个其条目被删除的地图?我想使用地图的原因是作为一个全局哈希表,它根据对象的 ID 跟踪对象。
ID ---> Object Address
Key ---> Value
(文本字符串在哪里ID
)
我希望在对象地址变弱时删除键值对,而不是指向它们的字符串。有人对此有任何想法吗?
例如,在Guava中支持这样的地图:
Map<..., ...> m = new MapMaker().weakValues().makeMap();
为什么要对条目进行垃圾收集?我看到两个原因
解决方案使用常规的 HashMap:
Map<String, WeakReference<Object>>
那么如果 2) 是唯一的问题,只需使用 myMap.get(myKey).get()
如果您还需要删除条目,请查看描述 softHashMap 并对其进行调整以使用弱引用的这篇文章...
您可以执行 WeakHashMap 所做的事情,但针对值而不是键:将值包装在 WeakReferences 中,并将它们与映射中保存的 ReferenceQueue 相关联。每当访问地图时,检查 ReferenceQueue 以查看是否添加了任何内容,如果有,则从地图中删除其条目。您需要创建一个 WeakReference 的子类来保存密钥,这样您就知道要删除哪个条目。您还需要对查询映射的方法(get 和 containsKey、迭代器方法等)添加检查,以检查检索到的 WeakReference 是否实际包含值(请记住禁止空值或使用特殊的哨兵对象代表他们)。
API有答案:
实现说明: WeakHashMap 中的值对象由普通的强引用保存。因此,应注意确保值对象不会直接或间接地强烈引用它们自己的键,因为这将防止键被丢弃。请注意,值对象可以通过 WeakHashMap 本身间接引用其键;也就是说,一个值对象可以强引用某个其他键对象,其关联的值对象反过来又强引用第一个值对象的键。解决此问题的一种方法是在插入之前将值本身包装在 WeakReferences 中,如:
m.put(key, new WeakReference(value))
,然后在每次获取时解包。