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

时间:2011-04-01 09:07:18

标签: java collections weakhashmap

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

8 个答案:

答案 0 :(得分:77)

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

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

答案 1 :(得分:43)

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

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

答案 2 :(得分:19)

checkout Effective Java,Edition 2,page 26。

  

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

答案 3 :(得分:11)

来自jGuru

  

WeakHashMap是一个特殊的Map   实现哪里的密钥   地图存储在   java.lang.ref.WeakReference。通过   将密钥存储在弱引用中,   键值对可以是动态的   当时只从地图上掉下来   关键的参考来自弱者   参考。这就是WeakHashMap   一个很好的实现   弱引用列表,其中条目   其他地方没有使用的可能是   掉了没有副作用。也,   只是因为钥匙可能掉落,   并不意味着它会立即成为   下降。如果系统足够   资源,弱关键参考   没有外部引用可以留下来   很长一段时间。

有关References的更多信息:

答案 4 :(得分:7)

弱引用是关于可达性,让垃圾收集器(GC)为您完成工作。 我认为最好理解弱引用试图解决的问题,并将其视为实际行动:

  • IBM article关于:

      

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

  • 关于何时使用WeakHashMap的blog article

      

    ...如果WeakHashMap对缓存没有好处,那么它有什么用呢?   实现规范地图是很好的。让我们说你想联想   一些额外的信息,你有一个强大的参考对象   至。您将一个条目放在WeakHashMap中,并将该对象作为键,然后   额外信息作为地图值。然后,只要你保持一个   强烈引用该对象,您将能够检查到该地图   检索额外的信息。一旦你释放了对象,那么   将清除映射条目并使用额外信息使用的内存   将会被释放。 ...

  • Java documentation about java.lang.ref

答案 5 :(得分:4)

人们用它来实现'缓存“。 如果您有一些可以重复使用的对象 通常在你的应用程序中,以及他们的 建筑很昂贵,那里 太多了,无法保留所有这些 在记忆中 - - 你使用WeakHashMap。

放置当前不存在的对象 用过的。当需要这个对象时 - 把它拿出来 的地图。在大多数情况下,大多数时间 物品将留在地图上。 诀窍是他们没有举行 直接,但通过WeakReferences。 因此,如果它真的“拥挤”,那么当我们跑步时 内存不足,gc将被允许收集 他们。 所以每次你试图让对象出来 WeakHashMap,你必须确保它 还在那里。否则你需要 重新创造它。

答案 6 :(得分:2)

您可以使用WeakHashmap来减少因缓存某些对象而导致内存泄漏的可能性。只要删除了对该键的所有引用,WeakHashMap就会自动删除条目。

答案 7 :(得分:0)

Weakhashmap允许其条目被垃圾收集,而不是等待完整的hashmap被使用。因此,当其密钥不再正常使用时,它将自动删除单个值。

它可用于防止内存泄漏,其中hashmap永远不会被回收,因为一个或多个密钥仍在使用中,即使最大值没有,如用户数据等......