什么是WeakHashMap以及何时使用它?

dev*_*per 144 java collections weakhashmap

什么是什么WeakHashMap时候应该使用它?a WeakHashMap和a 之间有什么区别HashMap

vic*_*irk 80

如果没有对密钥对象的其他强引用,则垃圾收集器可以回收弱hashmap中的元素,这使得它们对缓存/查找存储很有用.

弱引用不限于这些哈希表,您可以将WeakReference用于单个对象.它们对于保存资源非常有用,您可以保留对某些内容的引用,但允许在没有其他内容引用时对其进行收集.(顺便说一下,强引用是一个普通的java引用).也有弱引用,往往不像软引用那样容易收集(在最后一个强引用消失后不会长时间持续存在)

  • 根据这篇文章[链接](http://www.codeinstructions.com/2008/09/weakhashmap-is-not-cache-understanding.html),WeakHashMap不适合用于缓存,因为它依赖于对键的强引用,而不是存储在映射中的值. (21认同)
  • 如果缓存的数据在逻辑上与对象关联,我同意,但我很难通过经典缓存调用WeakHashMap缓存,因为缓存IMHO应该根据值或特定的到期策略而不是密钥删除数据. (8认同)
  • 关键不是强有力的参考.不明白为什么这是一个问题.在密钥对象消失的情况下,任何关联的缓存数据都被删除,听起来就像是对我的缓存/查找存储.如果您希望值本身可以回收,则可以通过WeakReference将它们存储在地图中,但在这种情况下您可以使用vanilla地图. (2认同)
  • 以上链接由Ivaylo现在已经死了 (2认同)

mmc*_*omb 45

正如其他人已经指出的那样,弱引用提供了一种将对象用作键而不创建对它的强引用的方法.这在您不希望损害JVM垃圾收集对象的能力的情况下非常有用,但仍然希望能够跟踪对象的某些方面,这使得弱引用非常适合缓存或存储有关对象的元数据.

我建议阅读"理解弱引用"(Oracle博客文章),关于Java中的强引用和弱引用.如果不了解差异,数据结构本身就没有多大意义.

  • 注意:@RichardRast和Sudhir Krishnan - 我修正了问题中的链接.它确实现在正在发挥作用. (3认同)
  • 这篇文章中的句子很好:弱引用允许您利用垃圾收集器为您确定可达性的能力,因此您不必自己完成. (2认同)

Hao*_*eng 20

checkout Effective Java,Edition 2,page 26.

内存泄漏的另一个常见原因是缓存.一旦将对象引用放入缓存中,就很容易忘记它就在那里并在它变得无关紧要之后很久就将它留在缓存中.这个问题有几种解决方案.如果你足够幸运地实现一个条目相关的缓存,只要在缓存之外有对其密钥的引用,就将缓存表示为WeakHashMap ; 条目将在过时后自动删除.请记住,只有当缓存条目的所需生存期由对键的外部引用而不是值确定时,WeakHashMap才有用.

  • SoftHashMap 是正确的选择。/sf/ask/385789561/#comment79506074_5511331 (2认同)

Buh*_*ndi 11

来自jGuru:

WeakHashMap是一种特殊的Map实现,其中地图的键存储在a中 java.lang.ref.WeakReference.通过将密钥存储在弱引用中,当对密钥的唯一引用来自弱引用时,可以动态地从映射中删除键 - 值对.这使得WeakHashMap成为弱引用列表的优秀实现,其中可以删除未在其他地方使用的条目而没有副作用.另外,仅仅因为键可能被丢弃,并不意味着它会被立即丢弃.如果系统具有足够的资源,则外部引用的弱密钥引用可能会保留很长时间.

更多关于参考文献:


Chr*_*ssy 7

弱引用是关于可达性,让垃圾收集器(GC)为您工作.我认为最好理解弱引用试图解决的问题,并在实际中看到它:

  • 一篇IBM文章:

    Java理论与实践:使用弱引用来堵塞内存泄漏.内存泄漏全局映射,识别内存泄漏,对救援的弱引用,......

  • 一个博客文章有关何时使用WeakHashMap中:

    ...如果WeakHashMap对缓存没有好处,那么它有什么用呢?实现规范地图是很好的.假设您想要将一些额外信息与您强烈引用的对象相关联.您将一个条目放在WeakHashMap中,并将对象作为键,将额外信息作为映射值.然后,只要您保持对对象的强引用,您就可以检查地图以检索额外信息.一旦释放对象,将清除映射条目,并释放额外信息使用的内存....

  • 有关java.lang.ref的Java 文档