我写这个问题的原因是,起初,我确实确实想知道为什么要这么做(因为我已有使用过的代码softKeys
)。但是,反思的原因很明显,因此我决定将其发布在这里,以防其他人也使用softKeys
并想知道同一件事。
简而言之,原因是
softKeys从一开始就没有任何意义。因此,最初包含它本身就是一个错误,Guava开发人员正在通过弃用纠正此错误。
通常,如果要在所有强引用都消失之后让对象停留一会儿,则可以使用软引用。相反,在使用弱引用时,通常在没有强引用或软引用的情况下立即收集对象。这对于您要暂时保留的缓存
值 很有用,因此使用相应键进行的查找将“恢复”该值的强引用。
但是,此行为对键没有任何意义:
- 由于
softKeys
和weakKeys
映射使用基于身份的查找,因此获取感兴趣条目的唯一方法是对其键进行强引用。†因此,一旦没有强大的键引用剩余,则该条目实际上将无效(无法恢复)。 - 之间的唯一区别
softKeys
,并weakKeys
为一个条目保留在地图上所有关键的强引用了多久都没有了。由于这样的条目无论如何都是死的,因此使用softKeys
而不是weakKeys
仅仅延迟条目的逐出是没有充分理由的。
因此,大多数情况下,遇到使用的代码时,
softKeys更合适的替代方法是
weakKeys。
†我没有考虑通过迭代或除基于键的查找以外的其他方法获取条目的情况,因为映射主要是基于键的操作。



