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

Sta*_*lin 72 java collections garbage-collection weak-references

来自J. Bloch

内存泄漏的来源是监听器......确保回调被及时垃圾回收的最佳方法是仅存储对它们的弱引用,例如,通过仅将它们存储为WeakHashMap中的键 .

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

mar*_*art 187

Set<Object> weakHashSet = Collections.newSetFromMap(
        new WeakHashMap<Object, Boolean>());
Run Code Online (Sandbox Code Playgroud)

正如在Collections.newSetFromMap文档中看到的,传递一个WeakHashMap来获得一个Set.

  • 值得注意的是,在API 9之前Android中缺少Collections#newSetFromMap.虽然找到一个可以编译到你的应用程序中的实现并不困难,但这是一个兼容性问题. (22认同)
  • 很容易想象为什么java.util的维护者可能想要停止提供他们所做的所有事情的双Map和Set版本,并选择只提供newSetFromMap()而不是......不是吗? (13认同)
  • 实际上java集合中的任何Set都包含用于存储的Map. (4认同)
  • 是的,但是为什么没有这类东西的具体课程呢? (4认同)
  • @Mike JavaDoc是正确的.请注意,此答案中的代码返回一组对象而不是布尔值.`newSetFromMap`创建一组键的类型,而不是值. (3认同)
  • 尝试了这个新的SetFromMap解决方案;大限制:不迭代就无法从集合中检索项目(性能杀手)。想要使用弱引用来删除重复对象,但只能比较键和检索值,而不能检索先前存储的匹配键(除非迭代)。Set 需要一个 key-getter 来检索存储的与 .equals() 匹配的实际对象。 (2认同)

Ste*_*n C 14

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

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


尽管可能存在有限的用例WeakHashSet,但Java类库设计原则的一部分是避免使用实用程序类为所有可能的用例填充类库.

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

当然,您可以使用Collections.newSetFromMap包装WeakHashMap实例.


1 - 辩论该决定的正确性超出了StackOverflow的范围.这是一个问答网站,而不是讨论论坛.