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

时间:2011-04-14 16:30:40

标签: java hashmap weakhashmap

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

ID --->  Object Address

Key ---> Value

(其中ID是文本字符串)

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

4 个答案:

答案 0 :(得分:7)

例如,在Guava

中支持此类地图
Map<..., ...> m = new MapMaker().weakValues().makeMap();

答案 1 :(得分:3)

API有答案:

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

答案 2 :(得分:3)

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

  1. 避免内存泄漏(避免将weakReference指向地图中的任何内容)
  2. 如果对象是垃圾回收的话,
  3. myMap.get(myKey)应返回null。
  4. 解决方案使用常规HashMap:

    Map<String, WeakReference<Object>>
    

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

    如果您还需要删除条目,请查看描述softHashMap的this post并调整它以使用weakReferences ...

答案 3 :(得分:1)

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