8

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

ID --->  Object Address

Key ---> Value

(文本字符串在哪里ID

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

4

4 回答 4

10

例如,在Guava中支持这样的地图:

Map<..., ...> m = new MapMaker().weakValues().makeMap();
于 2011-04-14T16:39:39.043 回答
3

为什么要对条目进行垃圾收集?我看到两个原因

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

解决方案使用常规的 HashMap:

Map<String, WeakReference<Object>>

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

如果您还需要删除条目,请查看描述 softHashMap 并对其进行调整以使用弱引用的这篇文章...

于 2011-04-14T17:12:45.713 回答
2

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

于 2011-04-14T17:52:49.933 回答
2

API有答案:

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

于 2011-04-14T16:41:40.800 回答