Java 我可以用WeakHashMap代替HashMap吗
我正在用Java进行Java 我可以用WeakHashMap代替HashMap吗,java,Java,我正在用Java进行WeakHashMap。我所理解的是,WeakHashMap与HashMap完全相同,只是它的关键引用是WeakReference。这意味着关键引用符合gc,当它被丢弃时,其条目将从地图中删除。这在HashMap中不可用。如果我错了,请纠正我 我这里有一个问题 现在,如果将来我需要使用Map来输入键和值,我可以继续使用WeakHashMap?或者,我需要考虑任何代码, WeakHashMap 不会适合 HashMap 是否适合?< /P> < P>有一个情况,它将不能替换哈希
WeakHashMap
。我所理解的是,WeakHashMap
与HashMap
完全相同,只是它的关键引用是WeakReference
。这意味着关键引用符合gc
,当它被丢弃时,其条目将从地图中删除。这在HashMap
中不可用。如果我错了,请纠正我
我这里有一个问题
现在,如果将来我需要使用Map来输入键和值,我可以继续使用WeakHashMap
?或者,我需要考虑任何代码,<代码> WeakHashMap <代码>不会适合<代码> HashMap <代码>是否适合?< /P> < P>有一个情况,它将不能替换哈希图,例如:
HashMap
,而不是接口类型Map
<>我建议只在需要时使用一个弱化映射(例如,一个侦听器注册表),并且只有当所有的触控代码被明确地为消失的条目做准备时。 你需要考虑上下文来决定使用一个弱化图是否正确/安全。 下面是一个WeakHashMap不起作用的示例(伪代码)
Map=。。。
永远做到:
name=从用户处获取名称
如果查找:
details=map.get(名称)
显示详细信息
否则,如果创建:
details=从用户获取详细信息
map.add(名称、详细信息)
使用WeakHashMap时,存在条目从表中掉出的风险,用户的查找将失败。有了HashMap,就没有风险了
还有一个问题是WeakReference和基于它的任何东西都比普通的引用更昂贵。他们使用更多的空间和时间。更重要的是,每次GC遇到引用类时,它们都会产生开销,这会增加GC暂停时间 然而,运行时开销的问题通常应该是正确性问题的次要问题
- 如果在应该使用
时使用WeakHashMap
,则很可能会遇到堆填充问题。这也存在性能问题HashMap
- 如果您在应该使用
的位置使用HashMap
,则可能会丢失信息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)