首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以用WeakHashMap代替HashMap吗?

我可以用WeakHashMap代替HashMap吗?
EN

Stack Overflow用户
提问于 2015-10-10 11:42:33
回答 2查看 445关注 0票数 4

我正在通过爪哇的WeakHashMap。我所理解的是,除了它的关键引用是WeakReference之外,WeakHashMapHashMap完全相同。这意味着键引用符合gc的条件,当它被清理时,它的条目将从映射中删除。这在HashMap中不可用。如果我错了,请纠正我。

我这里有一个问题。

现在,如果我得到一个要求,我必须使用映射来放置键和值,我可以继续使用WeakHashMap吗?或者,我是否需要考虑WeakHashMap不适合只适合HashMap的场景?

EN

回答 2

Stack Overflow用户

发布于 2015-10-10 12:25:13

您确实需要考虑上下文来决定使用WeakHashMap是否正确/安全。

下面是一个WeakHashMap无法工作的示例(伪代码)

代码语言:javascript
复制
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,则可能会丢失信息。
票数 2
EN

Stack Overflow用户

发布于 2015-10-10 12:08:24

在某些情况下,WeakHashMap不会取代HashMap,例如:

当调用一个参数类型是具体类型Map<K, V>.

  • When而不是接口类型的
  1. 时,您的代码假定没有其他任何东西从它下面改变映射。垃圾收集器可以随时删除弱键,导致WeakHashMap方法的行为就像条目刚刚被删除一样。因此,例如,如果您将map大小放入一个变量中,则实际的map可能比您枚举它时要小。(有关示例,请参阅JavaDoc。)将WeakHashMap传递给可能没有为此类更改做好准备的代码是有风险的。同步无济于事。当你不想要额外的空间和时间开销时,

我建议仅在需要时(例如侦听器注册表)以及所有接触到它的代码都显式准备好要消失的条目时才使用WeakHashMap。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33050021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档