来自J. Bloch
一个......内存泄漏的来源是监听器......确保回调被及时垃圾收集的最佳方法是仅存储对它们的弱引用,例如,将它们仅作为键存储在 WeakHashMap 中。
那么,为什么 Java Collections framework 中没有 WeakSet?
WeakHashMap
永远不会“确保回调被迅速收集垃圾”,而是使它们非常不确定。垃圾收集器只会在内存不足的情况下运行,因此,这样的弱监听器可能会在任意长时间内徘徊并且仍然被执行,但更糟糕的是,当你仍然需要时,这样的监听器可能会虚假地消失它们,因为它现在需要一个实际上不相关的强引用来保持它们的活力。
Collections.newSetFromMap
Set<Object> weakHashSet =
Collections.newSetFromMap(
new WeakHashMap<Object, Boolean>()
);
如 Collections.newSetFromMap
文档中所见,传递 WeakHashMap
以获取 Set
。
虽然您确实可以使用 Collections.newSetFromMap()
来获取 WeakSet,但它的用例实际上非常有限。
如果您想实现类似 String.intern()
的东西,您可能想看看 Guava 的 Interners.newWeakInterner()
功能。
不定期副业成功案例分享
newSetFromMap
创建一组键的类型,而不是值。