如何解决Java弱哈希映射-需要根据值的弱点而不是键来删除条目
|| 因此,Java的“ 0”允许创建一个映射,如果其键变弱,则将删除其条目。但是,当映射中的值变弱时,如何创建一个其条目被删除的映射?我要使用地图的原因是作为全局哈希表,该表根据对象的ID跟踪对象。ID ---> Object Address
Key ---> Value
(其中“ 2”是文本字符串)
我希望在对象地址变弱时删除键值对,而不是指向它们的字符串。有人对此有任何想法吗?
解决方法
例如,Guava支持这种地图:
Map<...,...> m = new MapMaker().weakValues().makeMap();
,API有答案:
实施注意事项:WeakHashMap中的value对象由普通的强引用保存。因此,应注意确保值对象不会直接或间接强烈引用其自身的键,因为这将防止键被丢弃。注意,值对象可以通过WeakHashMap本身间接引用其键;也就是说,值对象可以强烈地引用某个其他键对象,而其关联的值对象又强烈地引用第一值对象的键。一种解决方法是在插入之前将值本身包装在WeakReferences中,如下所示:
m.put(key,new WeakReference(value))
,然后在每次获取时解开包装。
,为什么要对条目进行垃圾收集?我看到两个原因
避免内存泄漏(避免保持弱引用指向您地图中的任何内容)
如果对象已被垃圾回收,则myMap.get(myKey)应返回null。
解决方案使用常规的HashMap:
Map<String,WeakReference<Object>>
那么如果2)是唯一的问题,只需使用myMap.get(myKey).get()
如果您还需要删除条目,请查看这篇文章,该文章描述了softHashMap并将其改编为使用weakReferences ...
,您可以执行WeakHashMap的操作,但可以执行值而不是键的操作:将值包装在WeakReferences中,然后将其与地图中保存的ReferenceQueue关联。每当访问地图时,请检查ReferenceQueue以查看是否已添加任何内容,如果已添加,则从地图中删除其条目。您需要制作一个包含密钥的WeakReference子类,因此您知道要删除哪个条目。您还需要向查询地图的方法(get和containsKey,迭代器方法等)中添加检查,以检查检索到的WeakReference实际包含值(记住禁止空值,或使用特殊的哨兵对象)代表他们)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。