有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java我可以使用WeakHashMap而不是HashMap吗

我正在用Java学习WeakHashMap。我所理解的是WeakHashMapHashMap完全相同,只是它的关键引用是WeakReference。这意味着键引用符合gc的条件,当它被丢弃时,它的条目将从映射中删除。这在HashMap中不可用。如果我错了,请纠正我

我这里有一个问题

现在在将来,如果我需要使用Map来放置键和值,我可以继续使用WeakHashMap吗?或者我需要考虑任何情况下^ {CD1}}将不适合^ ^ {CD3}}是否适合?


共 (2) 个答案

  1. # 1 楼答案

    在某些情况下,WeakHashMap不会替换哈希映射,例如:

    1. 调用参数类型为具体类型HashMap<K, V>而不是接口类型Map<K, V>的API时
    2. 当您的代码假定没有任何其他内容正在更改它下面的映射时。垃圾收集器可以在任何时候删除弱密钥,从而导致WeakHashMap方法的行为就好像当时删除了条目一样。因此,例如,如果将映射大小放入一个变量中,则实际映射可能比枚举它时的映射小。(有关示例,请参见JavaDoc。)将WeakHashMap传递给可能没有准备好进行此类更改的代码是有风险的。同步不会有帮助
    3. 当你不想要额外的空间和时间开销时

    我建议仅在需要时使用WeakHashMap(例如,侦听器注册表),并且仅当所有涉及它的代码都明确准备好消失条目时才使用WeakHashMap

  2. # 2 楼答案

    你需要考虑上下文来决定是否使用一个弱化映射是正确的/安全的。

    下面是一个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,可能会丢失信息