我正在寻找与
相当的东西WeakHashMap<K, V>
类,除了它将多个键映射到一个值,所以它更像是
WeakHashMap<K1, K2, V>
WeakHashMap<K1, K2, K3, V>
etc.
您get
和set
条目的方式就像数据库中的多列主键:您使用多个键放置项目,例如(K1, K2)
,要将该项目退回,您需要提供所有相同的密钥。相应的get
&amp; set
语义,GC语义将是:当一个条目不再可达时将被GC化,这意味着其任何的密钥不再可达。
还有其他人之前需要这样的东西吗?你会如何处理这样的要求?将一个元组存储为关键,就像在非弱HashMap中一样,它不起作用(元组几乎立即得到GC,没有人指向它)。
如果在我开心使用它之前已经做了类似的事情,而只是试着想一想如何用WeakReferences和普通的hashmap构建这样的东西,并且我想出一个空白。
答案 0 :(得分:1)
有趣的问题。我不知道这个的任何实现,但我会通过调整WeakHashMap
的源来实现它。它使用ReferenceQueue
并在几乎所有公共方法的开头轮询它,删除每个gc'ed指示对象的条目。
以下是我如何使WeakHashMap
成为多键弱映射的粗略概述:
ReferenceQueue
上找到引用组件时,查找它所参与的键组并从主条目集中删除这些键美中不足的是,所有这些内部地图必须以不会阻止关键组件被gc的方式设置。也就是说,在这个多键映射结构中必须没有硬(或软)引用。 WeakHashMap
通过使其内部Entry
类(实现Map.Entry
)扩展WeakReference
来实现此目的。当密钥是gc'ed时,放置在引用队列中的是Entry
对象,而不是密钥本身。这样的东西必须用于所有内部结构的设计(复合键对象,条目集,从键组件到键组的映射,以及键组本身)。