Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么存在WeakHashMap,但缺少WeakSet?_Java_Collections_Garbage Collection_Weak References - Fatal编程技术网

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

Java 为什么存在WeakHashMap,但缺少WeakSet?,java,collections,garbage-collection,weak-references,Java,Collections,Garbage Collection,Weak References,从 A。。。内存泄漏的来源是 听众 ... 确保 回调是垃圾收集的 及时是储存的唯一薄弱环节 例如,通过 仅将其作为密钥存储在 那么,为什么Java中没有任何弱点集呢?Collections.newSetFromMap Set weakHashSet= Collections.newSetFromMap( 新WeakHashMap() ); 正如在文档中所看到的,传递a来获得a。虽然您确实可以使用来获得WeakSet,但它的用例实际上是非常有限的 如果您想实现类似于String.intern

A。。。内存泄漏的来源是 听众 ... 确保 回调是垃圾收集的 及时是储存的唯一薄弱环节 例如,通过 仅将其作为密钥存储在

那么,为什么Java中没有任何弱点集呢?

Collections.newSetFromMap
Set weakHashSet=
Collections.newSetFromMap(
新WeakHashMap()
);
正如在文档中所看到的,传递a来获得a。

虽然您确实可以使用来获得WeakSet,但它的用例实际上是非常有限的


如果您想实现类似于
String.intern()
的功能,您可能需要看看Guava的功能。

实际上,java集合中的任何集合都包含用于存储的映射。是的,但是为什么没有针对这些东西的特定类呢?很容易想象,为什么java.util的维护者可能不想再提供双映射并设置他们所做的一切的版本,而是选择只提供newSetFromMap()。。。是吗?值得注意的是,API 9之前的Android中缺少Collections#newSetFromMap。不过,找到一个编译到应用程序中的实现并不困难,但这是一个兼容性问题。@Mike JavaDoc是正确的。请注意,此答案中的代码返回的是一组对象,而不是布尔值
newSetFromMap
创建了一组键的类型,而不是值。斯塔斯,你能接受mart的投票结果是正确的,而不是Martin的投票结果是错误的吗?虽然Joshua Bloch为Java程序员写了很多合理的建议,但这似乎是一个可怕的例外。将侦听器存储到一个
WeakHashMap
中并不能“确保回调被及时垃圾收集”,反而会使它们变得非常不确定。垃圾收集器只会在内存不足时运行,因此,这种弱侦听器可能会在任意长时间内悬空并仍在执行,但更糟糕的是,当您仍然需要它们时,这些侦听器可能会虚假地消失,因为它现在需要一个实际上不相关的强引用来保持它们的活力。
Set<Object> weakHashSet = 
    Collections.newSetFromMap(
        new WeakHashMap<Object, Boolean>()
    );