java我可以使用WeakHashMap而不是HashMap吗
我正在用Java学习WeakHashMap
。我所理解的是WeakHashMap
与HashMap
完全相同,只是它的关键引用是WeakReference
。这意味着键引用符合gc
的条件,当它被丢弃时,它的条目将从映射中删除。这在HashMap
中不可用。如果我错了,请纠正我
我这里有一个问题
现在在将来,如果我需要使用Map来放置键和值,我可以继续使用WeakHashMap
吗?或者我需要考虑任何情况下^ {CD1}}将不适合^ ^ {CD3}}是否适合?
# 1 楼答案
在某些情况下,WeakHashMap不会替换哈希映射,例如:
HashMap<K, V>
而不是接口类型Map<K, V>
的API时李>我建议仅在需要时使用WeakHashMap(例如,侦听器注册表),并且仅当所有涉及它的代码都明确准备好消失条目时才使用WeakHashMap
# 2 楼答案
你需要考虑上下文来决定是否使用一个弱化映射是正确的/安全的。
下面是一个WeakHashMap不起作用的示例(伪代码)
使用WeakHashMap时,存在条目从表中掉出的风险,用户的查找将失败。有了HashMap,就没有风险了
还有一个问题是WeakReference和基于它的任何东西都比普通的引用更昂贵。他们使用更多的空间和时间。更重要的是,每次GC遇到引用类时,它们都会产生开销,这会增加GC暂停时间
然而,运行时开销的问题通常应该是正确性问题的次要问题
如果您在应该使用
HashMap
时使用了WeakHashMap
,那么您很可能会遇到堆填充问题。这也存在性能问题如果在应该使用
HashMap
的地方使用WeakHashMap
,可能会丢失信息