我的问题是:如何将一堆值与一堆键关联起来
- 无需直接修改密钥,并且
- 在不阻止键被 GC 的情况下(知道值对键有强引用)
背景:
我需要将一堆复杂对象(称它们为值)与一些特定对象(称它们为键)相关联。
通常,我这样做的方式是使用关联键和值的哈希图。
这很好用。但是,我还需要确保映射不会干扰键的垃圾收集。换句话说,映射的存在不应阻止密钥被垃圾收集。
通常解决这个问题的方法是使用 WeakHashMap,它只保存对键的 WeakReferences。但是,WeakHashMaps 仅在映射中的值没有对键的强引用时才有效。不幸的是,我的值都对我的键有强引用,这会阻止键被垃圾收集。这也可以通过对值使用弱引用来解决,但这不是一个可行的解决方案,因为我不能让我的值在我的键之前被 GC'd。只要关键对象仍然存在,值也必须存在。
因此,对于这种情况,我的典型解决方案是停止使用 HashMap,而是修改键以对它需要的所有值进行强引用。这将确保我仍然可以获得给定键的所有值,但不会阻止该键在其自然生命周期完成时被 GC。
不幸的是,我无法修改键,因此无法将值直接添加到键中。那么还有哪些聪明的解决方案呢?