5

我正在寻找与

WeakHashMap<K, V>

类,除了它将多个键映射到一个值,所以它真的更像

WeakHashMap<K1, K2, V>
WeakHashMap<K1, K2, K3, V>
etc.

getset条目的方式就像数据库中的多列主键:您使用多个键放置项目,例如(K1, K2),并且要取出该项目,您需要提供您用来放入它的所有get相同的键。鉴于这些&set语义,GC 语义将是:一个条目将在不再可达时被 GC,这意味着它的任何键都不再可达。

以前有没有其他人需要这样的东西?您将如何处理这样的要求?像在非弱 HashMap 中那样存储元组作为键是行不通的(元组几乎立即被 GC,没有人指向它)。

如果在我很乐意使用它之前已经制作了这样的东西,但只是想想想我将如何用 Wea​​kReferences 和普通的 hashmap 构建这样的东西,然后我想出了一个空白。

4

1 回答 1

1

有趣的问题。我不知道这个的任何实现,但我会通过调整源代码来解决它WeakHashMap。它使用 aReferenceQueue并在几乎每个公共方法开始时对其进行轮询,删除每个 gc 引用的条目。

以下是我如何适应WeakHashMap多键弱图的粗略概述:

  1. 像您描述的那样定义一个复合键并将其用于主条目集
  2. 维护从关键组件到其参与的键集的内部映射
  3. 当你在 上找到一个引用组件时ReferenceQueue,查找它参与的键集,并从主条目集中删除这些键
  4. 您还需要从每个其他关键组件的集合中删除它参与的每个键。也就是说,假设您在参考队列中找到了一个关键组件 c 1并且它参与了密钥 k 1,...,k n。然后对于每个 k i,如果其他关键组件是 c 2和 c 3,则需要从 c 2和 c 3的密钥集中删除 k i,以及删除 c 1的整个条目。
  5. 当组件的键集为空时,您可能还应该删除该组件的键集映射条目。这意味着您可能会在引用队列中找到在组件到键集映射中没有相应数据的组件。

美中不足的是,所有这些内部映射必须以不会阻止关键组件被 gc'ed 的方式设置。也就是说,在这个多键映射结构中不能有硬(或软)引用。WeakHashMap通过使其内部Entry类(实现Map.Entry)扩展来实现这一点WeakReference。当一个键被 gc'ed 时,Entry被放置在引用队列中的是对象,而不是键本身。在所有内部结构的设计中都必须使用这样的东西(复合键对象、条目集、从键组件到键集的映射以及键集本身)。

于 2012-12-13T04:56:16.233 回答