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时解包。
为什么要将条目垃圾回收? 我看到两个原因
- 避免内存泄漏(避免将weakReference指向Map中的任何内容)
- 如果对象是垃圾回收的,myMap.get(myKey)应该返回null。
解决方案使用常规HashMap:
Map>
然后,如果2)是唯一的问题,只需使用myMap.get(myKey).get()
如果您还需要删除条目,请查看描述softHashMap的这篇文章 ,并使其适应使用weakReferences …
您可以执行WeakHashMap所做的事情,但是可以使用值而不是键:将值包装在WeakReferences中,并将它们与地图中保存的ReferenceQueue相关联。 每当访问地图时,请检查ReferenceQueue以查看是否添加了任何内容,如果有,则从地图中删除其条目。 您需要创建一个包含密钥的WeakReference子类,以便您知道要删除的条目。 您还需要对查询映射的方法(get和containsKey,迭代器方法等)添加一个检查,以检查检索到的WeakReference是否实际包含一个值(记住要么禁用空值,要么使用特殊的sentinel对象来代表他们)。