我正在通过爪哇的WeakHashMap。我所理解的是,除了它的关键引用是WeakReference之外,WeakHashMap与HashMap完全相同。这意味着键引用符合gc的条件,当它被清理时,它的条目将从映射中删除。这在HashMap中不可用。如果我错了,请纠正我。
我这里有一个问题。
现在,如果我得到一个要求,我必须使用映射来放置键和值,我可以继续使用WeakHashMap吗?或者,我是否需要考虑WeakHashMap不适合只适合HashMap的场景?
发布于 2015-10-10 12:25:13
您确实需要考虑上下文来决定使用WeakHashMap是否正确/安全。
下面是一个WeakHashMap无法工作的示例(伪代码)
Map<Name, Details> map = ...
do for ever:
name = get name from user
if lookup:
details = map.get(name)
display details
else if create:
details = get details from user
map.add(name, details)使用WeakHashMap时,存在条目将从表中删除的风险,并且用户的查找将失败。有了HashMap,就没有风险。
还有一个问题是,WeakReference和任何构建在它之上的东西都比普通的参考资料更昂贵。他们使用更多的空间和时间。更重要的是,每次GC遇到引用类时都会产生开销,这会增加GC暂停时间。
然而,运行时开销的问题通常应该是正确性问题的次要问题。
HashMap的情况下使用WeakHashMap,则很容易遇到堆填满问题。这也有性能问题。HashMap的地方使用WeakHashMap,则可能会丢失信息。发布于 2015-10-10 12:08:24
在某些情况下,WeakHashMap不会取代HashMap,例如:
当调用一个参数类型是具体类型Map<K, V>.
我建议仅在需要时(例如侦听器注册表)以及所有接触到它的代码都显式准备好要消失的条目时才使用WeakHashMap。
https://stackoverflow.com/questions/33050021
复制相似问题