具有多个键的Java WeakHashMap?

具有多个键的Java WeakHashMap?,java,scala,garbage-collection,hashmap,Java,Scala,Garbage Collection,Hashmap,我正在寻找一个与 WeakHashMap<K, V> WeakHashMap 类,只是它将多个键映射到一个值,所以它实际上更像 WeakHashMap<K1, K2, V> WeakHashMap<K1, K2, K3, V> etc. WeakHashMap WeakHashMap 等 您获取和设置条目的方式类似于数据库中的多列主键:您使用多个键(例如,(K1,K2))放置项目,要将该项目取回,您需要提供所有用于放置项目的键。考虑到这些get&set

我正在寻找一个与

WeakHashMap<K, V>
WeakHashMap
类,只是它将多个键映射到一个值,所以它实际上更像

WeakHashMap<K1, K2, V>
WeakHashMap<K1, K2, K3, V>
etc.
WeakHashMap
WeakHashMap
等
您获取和设置条目的方式类似于数据库中的多列主键:您使用多个键(例如,
(K1,K2)
)放置项目,要将该项目取回,您需要提供所有用于放置项目的键。考虑到这些
get
&
set
语义,GC语义将是:当一个条目不再可访问时,它将被GCed,这意味着它的任何键都不再可访问

以前还有人需要这样的东西吗?您将如何满足这样的要求?像在非弱HashMap中一样,将一个元组存储为键是行不通的(元组几乎立即被GCed,没有人指向它)


如果以前做过类似的东西,我很乐意使用它,但我只是想知道如何用weakreference和普通hashmap构建这样一个东西,我得到了一个空白

有趣的问题。我不知道这方面有什么实现,但我会通过修改
WeakHashMap
的源代码来实现。它使用一个
ReferenceQueue
并在几乎每个公共方法的开始处轮询它,删除每个gc引用对象的条目

以下是我对如何将
WeakHashMap
调整为多键弱映射的粗略概述:

  • 如前所述定义复合键,并将其用于主条目集
  • 维护从键组件到它所参与的键集的内部映射
  • 当您在
    ReferenceQueue
    上找到一个referent组件时,请查找它所参与的密钥集,并从主条目集中删除这些密钥
  • 您还需要从每个其他关键点组件的集合中删除它参与的每个关键点。也就是说,假设您在引用队列中找到一个键组件c1,它参与了键k1,…,kn。然后,对于每个ki,如果其他关键组件是c2和c3,则需要从c2和c3的键集中删除ki,并删除c1的整个条目
  • 当组件的键集为空时,可能还应该删除该组件的键集映射项。这意味着您可能会在引用队列中找到一个组件,该组件到键集映射中没有相应的数据

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

    为什么不能将
    WeakHashMap
    包装在您自己的类中,将复合键构建为单个字符串或对象(使用
    equals()
    hashCode()
    )?因为新的复合键将没有人引用它,并且在我将其放入弱哈希映射时将立即得到gcd。