gpt4 book ai didi

具有多个键的 Java WeakHashMap?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:33:17 30 4
gpt4 key购买 nike

我正在寻找与

等价的
WeakHashMap<K, V>

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

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

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

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

如果在我很乐意使用它之前已经制作了这样的东西,但只是想想想我将如何从 WeakReferences 和普通 HashMap 中构建这样的东西并且我想出了一个空白。

最佳答案

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

这是我关于如何将 WeakHashMap 改编为多键弱映射的粗略概述:

  1. 像您描述的那样定义一个复合键并将其用于主条目集
  2. 维护从关键组件到它参与的 key 集的内部映射
  3. 当您在 ReferenceQueue 上找到引用组件时,查找它参与的键集并从主条目集中删除这些键
  4. 您还需要从所有其他 key 组件的集合中删除它参与的每个 key 。也就是说,假设您在引用队列中找到一个关键组件 c1 并且它参与了键 k1, ..., kn .那么对于每一个ki,如果其他关键成分是c2和c3,则需要去掉ki 从 c2 和 c3 的键集中,以及删除 c1 的整个条目。
  5. 当组件的键集为空时,您可能还应该删除该组件的键集映射条目。这意味着您可能会在引用队列中找到组件到键集映射中没有对应数据的组件。

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

关于具有多个键的 Java WeakHashMap?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13852901/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com