因此,Java WeakHashMap
允许创建一个映射,如果其键变弱,则删除其条目。但是,当地图中的值变弱时,如何创建一个其条目被删除的Map?我想使用地图的原因是全局哈希表,它根据ID来跟踪对象。
ID ---> Object Address
Key ---> Value
(其中ID
是文本字符串)
我希望在对象地址变弱时删除键值对,而不是指向它们的字符串。有人对此有任何想法吗?
答案 0 :(得分:7)
例如,在Guava:
中支持此类地图Map<..., ...> m = new MapMaker().weakValues().makeMap();
答案 1 :(得分:3)
API有答案:
实施说明: WeakHashMap中的值对象由普通的强引用保存。因此,应该注意确保值对象不直接或间接地强烈引用它们自己的密钥,因为这将防止密钥被丢弃。注意,值对象可以通过WeakHashMap本身间接引用它的键;也就是说,值对象可以强烈地引用一些其他关键对象,其关联值对象又强烈地引用第一值对象的关键字。处理此问题的一种方法是在插入之前将值本身包装在WeakReferences中,如下所示:
m.put(key, new WeakReference(value))
,然后在每次获取时解开。
答案 2 :(得分:3)
为什么要将条目垃圾回收?我看到两个原因
解决方案使用常规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对象代表他们。)