Java 何时应该使用MapMaker类的weakValue()?

Java 何时应该使用MapMaker类的weakValue()?,java,guava,Java,Guava,当映射中的条目具有弱键引用时,该条目将在下一次垃圾收集时被删除,对吗 我可以理解MapMaker类提供了weakKeys方法。但我对weakValue()感到困惑。我什么时候应该在MapMaker中使用weakValue或softValue?当您希望对其值弱可及的条目进行垃圾收集时,应该使用weakValue()。例如,这可能有用。。。假设您有一个类,该类允许用户向其中添加对象,并将它们作为值存储在映射中。该类通常作为单例使用,因此它将在应用程序运行的整个过程中保持不变。但是,用户添加到其中的对

当映射中的条目具有弱键引用时,该条目将在下一次垃圾收集时被删除,对吗

我可以理解
MapMaker
类提供了
weakKeys
方法。但我对
weakValue()
感到困惑。我什么时候应该在
MapMaker
中使用
weakValue
softValue

当您希望对其值弱可及的条目进行垃圾收集时,应该使用
weakValue()
。例如,这可能有用。。。假设您有一个类,该类允许用户向其中添加对象,并将它们作为值存储在
映射中。该类通常作为单例使用,因此它将在应用程序运行的整个过程中保持不变。但是,用户添加到其中的对象不一定存在很长时间。应用程序将在完成之前很久完成。您不希望用户在处理完这些对象后必须手动从类中删除它们,但也不希望通过将对它们的引用永久保留在类中而导致内存泄漏(换句话说,垃圾收集应该像正常一样工作,忽略类)。解决方案是给map
weakValues()
,一切都将按照您的意愿运行


softValues()
适用于缓存。。。如果您有一个
映射
,并且希望条目能够根据内存需求进行删除,那么您应该使用它。您不想使用
weakKeys()
softKeys()
,因为它们都使用
=
标识,这会给您带来问题(无法获得key
300
的值,因为您传入的密钥可能不会
=
地图中的密钥)。

@CollinD感谢您的回复。如果我使用softValues()而不是软键(),则无法自动删除条目,对吗?当值被回收时,即使密钥仍然存在,我也会得到null。我会想象,如果对应的值是弱/软&GC'ed,密钥就会消失。。。但是我不确定。@mlaw我很确定它是,但是文档没有明确说明。IMHO@jlchen:软键/弱键/值的存在都是为了允许自动删除条目。因此,可以自动回收条目。