为什么存在WeakHashMap,但缺少WeakSet?

时间:2010-10-31 11:35:06

标签: java collections garbage-collection weak-references

来自J. Bloch

  

A ......内存泄漏的来源是   听众   ......确保这一点的最佳方法   回调是垃圾收集   及时是只存储弱者   例如,引用它们   仅将它们存储为密钥   WeakHashMap

那么,为什么Java Collections framework中没有任何WeakSet?

4 个答案:

答案 0 :(得分:181)

Set<Object> weakHashSet = Collections.newSetFromMap(
        new WeakHashMap<Object, Boolean>());

Collections.newSetFromMap文档中所示,通过WeakHashMap获取Set

答案 1 :(得分:15)

  

那么,为什么java集合框架中没有任何WeakSet?

唯一真正正确的答案是我们无法告诉你原因,因为我们不是做出设计决策的人。只有 Java设计师知道他们做出决定的原因 1


虽然WeakHashSet的用例可能有限,但Java类库设计理念的一部分是避免使用实用程序类填充类库以用于所有可能的用例。

还有许多其他类库包含集合类型; Apache Commons Collections和Google Collections(又名Guava)就是很好的例子。但是,WeakHashSet甚至没有“削减”Apache和Google库。

当然,您可以使用Collections.newSetFromMap来封装WeakHashMap个实例。


1 - 辩论该决定的正确性超出了StackOverflow的范围。这是一个Q&amp; A网站,而不是讨论论坛。

答案 2 :(得分:1)

虽然您确实可以使用Collections.newSetFromMap()来获取WeakSet,但它的用例实际上非常有限。

如果你想实现像String.intern()这样的东西,你可能想要看一下Guava的Interners.newWeakInterner()功能。

答案 3 :(得分:-66)

很简单:WeakHashMap有一些用例(特别是在你想要注释具有附加属性的对象的情况下),但WeakSets没有用例。