【问题标题】:Combo of IdentityHashMap and WeakHashMapIdentityHashMap 和 WeakHashMap 的组合
【发布时间】:2014-05-19 13:48:40
【问题描述】:

我需要一个Map 实现,它共享IdentityHashMapWeakHashMap 的属性(引用相等而不是equals() 和键上的弱引用)。

您推荐哪种实现方式(必须在 Android 上运行)?

【问题讨论】:

  • IdentityHashMap<WeakReference<K>, V>?
  • @fge 我在想,但是当它被收集时,它不会从地图中删除它。
  • @assylias 呃好吧,我明白了问题...然后WeakHashMap<Equivalence.Wrapper<K>, V> 可以解决问题(使用Equivalence.identity()),但这需要番石榴并使用.wrap() 插入密钥
  • map.get(new Wrapper(t)); 应该可以工作。
  • 对于我读过这些 cmets 的漫游程序员 - 不要使用 fge 的解决方案 - 它不起作用。它可能看起来像它,但它已经坏了。这就是为什么 - WeakHashMap 将指向 Equivalence.Wrapper<K> 而不是 K 因此在收集 Equivalence.Wrapper<K> 时将删除密钥,而不是在收集 K 时删除。 Equivalence.Wrapper<K> 可能(并且很可能会)被收集,而 K 仍然存在。

标签: java android map weak-references referenceequals


【解决方案1】:

如果您建议使用 Guava,那么 new MapMaker().weakKeys().makeMap() 将直接完成这项工作,因为 weakKeys 对键使用引用相等性。

weakKeys 的文档说:

指定存储在映射中的每个键(不是值)都应该包装在 WeakReference 中(默认情况下,使用强引用)。 警告:使用此方法时,生成的 map 将使用标识 (==) 比较来确定键的相等性,这在技术上违反了 Map 规范,并且可能不是您所期望的。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-28
  • 1970-01-01
  • 2018-06-13
  • 2010-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多