我什么时候应该使用MapMaker类的weakValues()?

jlc*_*hen 5 java guava

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

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

Col*_*inD 5

weakValues()当您希望对那些值弱可达的条目进行垃圾收集时,您可以使用它。举例说明这何时可能有用......假设您有一个类,允许用户向其中添加对象并Map出于任何原因将它们作为值存储在 a 中。此类通常用作单例,因此它会在应用程序运行的整个过程中一直存在。然而,用户添加到其中的对象不一定那么长寿。申请早在完成之前就会和他们一起完成。您不希望用户在使用完这些对象后必须手动从您的类中删除这些对象,但您也不希望通过永远在您的类中保留对它们的引用而导致内存泄漏(换句话说,垃圾收集应该只是像平常一样工作,忽略你的课程)。解决方案是提供地图weakValues(),一切都会按照您的意愿进行。

softValues()对于缓存很有用...如果您有一个Map<Integer, Foo>并且您希望条目可以根据内存需求而可移动,那么您会想要使用它。您不想使用weakKeys()or ,softKeys()因为它们都使用==身份,这会给您带来问题(无法通过 key 300out 获取值,因为您传入的键可能不是==映射中的键)。