Java弱哈希映射 – 需要根据值的弱点而不是键来删除条目

因此,Java WeakHashMap允许创建一个映射,如果其键变弱,则删除其条目。 但是,当地图中的变弱时,如何创建一个其条目被删除的Map? 我想使用地图的原因是全局哈希表,它根据ID来跟踪对象。

 ID ---> Object Address Key ---> Value 

(其中ID是文本字符串)

我希望在对象地址变弱时删除键值对,而不是指向它们的字符串。 有人对此有何看法?

例如,在番石榴中支持这样的地图:

 Map<..., ...> m = new MapMaker().weakValues().makeMap(); 

API有答案:

实现说明: WeakHashMap中的值对象由普通的强引用保存。 因此,应该注意确保值对象不直接或间接地强烈引用它们自己的密钥,因为这将防止密钥被丢弃。 请注意,值对象可以通过WeakHashMap本身间接引用其键; 也就是说,值对象可以强烈地引用一些其他关键对象,其关联的值对象又强烈地引用第一值对象的关键字。 处理此问题的一种方法是在插入之前将值本身包装在WeakReferences中,如: m.put(key, new WeakReference(value)) ,然后在每次get时解包。

为什么要将条目垃圾回收? 我看到两个原因

  1. 避免内存泄漏(避免将weakReference指向Map中的任何内容)
  2. 如果对象是垃圾回收的,myMap.get(myKey)应该返回null。

解决方案使用常规HashMap:

 Map> 

然后,如果2)是唯一的问题,只需使用myMap.get(myKey).get()

如果您还需要删除条目,请查看描述softHashMap的这篇文章 ,并使其适应使用weakReferences …

您可以执行WeakHashMap所做的事情,但是可以使用值而不是键:将值包装在WeakReferences中,并将它们与地图中保存的ReferenceQueue相关联。 每当访问地图时,请检查ReferenceQueue以查看是否添加了任何内容,如果有,则从地图中删除其条目。 您需要创建一个包含密钥的WeakReference子类,以便您知道要删除的条目。 您还需要对查询映射的方法(get和containsKey,迭代器方法等)添加一个检查,以检查检索到的WeakReference是否实际包含一个值(记住要么禁用空值,要么使用特殊的sentinel对象来代表他们)。