WeakHashMap
是什么?何时应该使用它?WeakHashMap
和 HashMap
之间有什么区别?
WeakHashMap
是什么?何时应该使用它?WeakHashMap
和 HashMap
之间有什么区别?
如果没有其他对键对象的强引用,弱哈希映射中的元素可以被垃圾回收器回收,这使它们非常适用于缓存/查找存储。
弱引用不仅限于这些哈希表,您还可以使用WeakReference来处理单个对象。它们有助于节省资源,您可以保持对某个东西的引用,但在没有其他引用时允许其被回收(顺便说一下,强引用是正常的Java引用)。还有一种弱引用,通常不像软引用那样容易被收集(当最后一个强引用消失后,软引用往往不会持续太久)。
正如其他人已经指出的那样,弱引用提供了一种使用对象作为键而不创建对它的强引用的方法。这在你不想削弱JVM垃圾回收能力却仍然需要追踪对象某方面的情况下非常有用,因此弱引用非常适合用于缓存或存储关于对象的元数据。
我建议阅读 Oracle 博客文章《理解弱引用》,其中介绍了 Java 中的强引用与弱引用的区别。如果没有理解这个区别,该数据结构本身就毫无意义。
请查看Effective Java第二版26页。
另一个常见的内存泄漏来源是缓存。一旦您将对象引用放入缓存中,很容易忘记它在那里,并在其变得无关紧要之后长时间将其留在缓存中。有几种解决方案可解决这个问题。如果您足够幸运实现了一个缓存,其中条目仅在缓存外部对其键具有引用时才相关,请将缓存表示为WeakHashMap; 条目将在过时后自动删除。请记住,WeakHashMap仅在所需的缓存条目的寿命由键的外部引用(而不是值)确定时才有用。
来自jGuru:
WeakHashMap是一种特殊的Map实现,其中map的键存储在
java.lang.ref.WeakReference
中。通过将键存储在弱引用中,当仅从弱引用引用到键时,键-值对可以动态地从map中丢弃。这使得WeakHashMap成为一个弱引用列表的优秀实现,在该列表中,未在其他地方使用的条目可能会被删除且没有副作用。另外,仅因为可以删除键,并不意味着它会立即被删除。如果系统有足够的资源,则未在外部引用的弱键引用可能会保留很长时间。
更多关于引用(References):
一篇关于IBM文章的内容:
Java理论与实践:使用弱引用修复内存泄漏。 全局映射的内存泄漏,识别内存泄漏,弱引用拯救,...
一篇关于何时使用WeakHashMap的博客文章(链接已失效):
... 如果WeakHashMap不适用于缓存,那它有什么用处呢? 它适用于实现规范化映射。比如说你想将一些额外的信息与你持有强引用的对象关联起来。 你在WeakHashMap中放置一个以对象为键、额外信息为值的条目。只要你持有该对象的强引用, 就可以检查映射以检索额外信息。一旦释放对象,映射条目就会被清除,额外信息所占用的内存也会被释放。...
人们使用它来实现“缓存内存”。如果您的应用程序中有一些经常重复使用的对象,并且它们的构建很昂贵,而且有太多的对象无法全部保存在内存中,那么您可以使用WeakHashMap。
将当前未使用的对象放入其中。当需要该对象时,从地图中取出。大多数情况下,这些对象将停留在地图中。诀窍在于它们不是直接持有,而是通过WeakReferences进行持有。所以,如果真的“拥挤”了,当我们的内存不足时,GC将被允许收集它们。因此,每次尝试从WeakHashMap中获取对象时,您必须确保它仍然存在。否则,您需要重新创建它。
WeakHashMap
的答案基本上解释了它和普通HashMap
之间的区别。重复相同的问题并不会使它成为一个新问题。 - Péter Török