具有多个键的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组件时,请查找它所参与的密钥集,并从主条目集中删除这些密钥这里美中不足的是,所有这些内部映射必须以一种不会阻止关键组件被gc’ed的方式设置。也就是说,在这个多键映射结构中不能有硬(或软)引用
WeakHashMap
通过使其内部条目
类(实现Map.Entry
)扩展WeakReference来实现这一点。当一个键被gc'ed时,它是条目
对象,而不是键本身,被放置在引用队列中。在所有内部结构(复合键对象、条目集、从键组件到键集的映射以及键集本身)的设计中都必须使用类似的内容。为什么不能将WeakHashMap
包装在您自己的类中,将复合键构建为单个字符串或对象(使用equals()
和hashCode()
)?因为新的复合键将没有人引用它,并且在我将其放入弱哈希映射时将立即得到gcd。