Java 为什么在Guava 10中不推荐使用软键()?
从Guava 10开始,已弃用,并且中不存在相应的方法 为什么会有这样的变化?我需要对使用它的现有代码做什么?我写这个问题是因为,一开始,我真的很想知道为什么(因为我有使用Java 为什么在Guava 10中不推荐使用软键()?,java,guava,Java,Guava,从Guava 10开始,已弃用,并且中不存在相应的方法 为什么会有这样的变化?我需要对使用它的现有代码做什么?我写这个问题是因为,一开始,我真的很想知道为什么(因为我有使用软键的现有代码)。然而,原因在反思中是显而易见的,我决定将其发布在这里,以防其他人也使用软键,并对同样的事情感到疑惑 简而言之,原因是软键从一开始就没有任何意义。因此,它最初的加入本身就是一个错误,番石榴开发商正在通过反对纠正这个错误 一般来说,如果希望对象在所有强引用消失后保持一段时间,可以使用软引用;相反,对于弱引用,一旦
软键的现有代码)。然而,原因在反思中是显而易见的,我决定将其发布在这里,以防其他人也使用软键
,并对同样的事情感到疑惑
简而言之,原因是软键
从一开始就没有任何意义。因此,它最初的加入本身就是一个错误,番石榴开发商正在通过反对纠正这个错误
一般来说,如果希望对象在所有强引用消失后保持一段时间,可以使用软引用;相反,对于弱引用,一旦没有强引用或软引用,对象通常会很快被收集。这对于要暂时保留的缓存值非常有用,因此使用相应键的查找将“恢复”该值的强引用
但是,这种行为对键没有任何意义:
- 由于
软键
和weakKeys
地图使用基于身份的查找,获取感兴趣的条目的唯一方法是对其键进行强引用。†因此,一旦没有强键引用,条目实际上就死了(没有复活的可能性)
软键
和weakKeys
之间唯一实际的区别是,在所有对其键的强引用消失后,条目在地图中保留的时间有多长。因为这样的条目无论如何都是死的,所以使用软键
而不是weakKeys
只会延迟条目的退出,这是没有充分理由的
因此,当遇到使用软键的代码时,最合适的替代方法是weakKeys
†我不考虑通过迭代或基于键的查找以外的任何方式获取条目的情况,因为映射主要是关于基于键的操作。以下是我对该问题的解释(对Chris的回答更完整一点)
为什么软键使用身份匹配?这是WeakHashMap的设计,它不必遵循。而softValues
对我来说也毫无意义;也许softEntry
更合适。@不可替换的softValues
表示“保留对该值的软引用,如果该引用被清除,则删除该项。”拥有softEntries
是没有意义的,因为您通常不会持有Map.Entry
对象。这一切都是您自己解决的!?你完全正确。我们花了三年时间才意识到这一点。:-)@实际上,不可替换的WeakHashMap不使用标识。但身份是唯一真正有意义的东西。通过使用弱键或软键(与值相反),您表明该键的GC是一个重要事件——这意味着可以清除条目,因为它不太可能很快再次被查询。对于值对象(使用重写的equals()),这是不合逻辑的。一个引用可能是GC'd,但有任意数量的其他引用浮动。@unreputable(我到达这个线程有点晚)对一个键的软引用是一个值对象(具有重写的equals)似乎是完全有意义的,因为只有当内存不足时,键(及其映射项)才会被丢弃。对值对象的弱引用没有多大意义(可能在时间缓存中除外)。但是,对于软引用对象的基于身份的查找,如在Guava maps中,软引用键没有多大意义,但这是因为坚持基于身份的查找,而不是因为软引用。