内存泄漏的一个来源是侦听器。确保迅速回收垃圾的最佳方法是仅存储对其的弱引用,例如,仅将它们作为键存储在 WeakHashMap中。
那么,为什么Java Collections框架中没有任何WeakSet ?
内存泄漏的一个来源是侦听器。确保迅速回收垃圾的最佳方法是仅存储对其的弱引用,例如,仅将它们作为键存储在 WeakHashMap中。
那么,为什么Java Collections框架中没有任何WeakSet ?
WeakHashMap
并不会“确保立即回收垃圾”,而是使它们变得非常不确定。垃圾收集器仅在内存不足时运行,因此,此类弱的侦听器可能会在任意长时间内晃来晃去并仍在执行,但更糟糕的是,此类侦听器在您仍需要它们时可能会虚假地消失,因为它现在需要一个实际上无关紧要的参考资料,以使他们活着。
Answers:
Set<Object> weakHashSet = Collections.newSetFromMap(
new WeakHashMap<Object, Boolean>());
如Collections.newSetFromMap
文档所示,传递WeakHashMap
来获取Set
。
newSetFromMap
创建一组键类型,而不是值。
那么,为什么Java收集框架中没有任何WeakSet?
唯一真正正确的答案是,我们不能告诉您原因,因为我们不是做出设计决定的人。只有Java设计师知道他们为什么做出决定1。
尽管的用例可能有限WeakHashSet
,但Java类库设计理念的一部分是避免针对所有可能的用例用实用程序类填充类库。
还有许多其他类库,其中包括集合类型。Apache Commons Collections和Google Collections(又名Guava)就是很好的例子。但是,WeakHashSet
甚至还没有“削减” Apache和Google库。
而且,当然,您可以Collections.newSetFromMap
用来包装WeakHashMap
实例。
1-辩论该决定的正确性超出了StackOverflow的范围。这是一个问答网站,而不是讨论论坛。
WeakHashMap
not的用例WeakHashSet
。他是否特别提到缺少弱散列集的问题?如果没有,那么你不能要求他作为一个权威的要求,这是一个问题。无论如何,这是一个问答,而不是辩论。我只是用Java设计人员通常给出的答案(不包括此类内容)来回答OP的问题。您(或OP)是否同意……仅此而已。
虽然您确实可以Collections.newSetFromMap()
用来获取WeakSet,但其用例实际上非常有限。
如果您想实现类似String.intern()
的Interners.newWeakInterner()
功能,则可能需要看看Guava的功能。