Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我可以用WeakHashMap代替HashMap吗_Java - Fatal编程技术网

Java 我可以用WeakHashMap代替HashMap吗

Java 我可以用WeakHashMap代替HashMap吗,java,Java,我正在用Java进行WeakHashMap。我所理解的是,WeakHashMap与HashMap完全相同,只是它的关键引用是WeakReference。这意味着关键引用符合gc,当它被丢弃时,其条目将从地图中删除。这在HashMap中不可用。如果我错了,请纠正我 我这里有一个问题 现在,如果将来我需要使用Map来输入键和值,我可以继续使用WeakHashMap?或者,我需要考虑任何代码, WeakHashMap 不会适合 HashMap 是否适合?< /P> < P>有一个情况,它将不能替换哈希

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

我这里有一个问题

现在,如果将来我需要使用Map来输入键和值,我可以继续使用
WeakHashMap
?或者,我需要考虑任何代码,<代码> WeakHashMap <代码>不会适合<代码> HashMap <代码>是否适合?< /P> < P>有一个情况,它将不能替换哈希图,例如:

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

  • <>我建议只在需要时使用一个弱化映射(例如,一个侦听器注册表),并且只有当所有的触控代码被明确地为消失的条目做准备时。

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

    下面是一个WeakHashMap不起作用的示例(伪代码)

    Map=。。。
    永远做到:
    name=从用户处获取名称
    如果查找:
    details=map.get(名称)
    显示详细信息
    否则,如果创建:
    details=从用户获取详细信息
    map.add(名称、详细信息)
    
    使用WeakHashMap时,存在条目从表中掉出的风险,用户的查找将失败。有了HashMap,就没有风险了


    还有一个问题是WeakReference和基于它的任何东西都比普通的引用更昂贵。他们使用更多的空间和时间。更重要的是,每次GC遇到引用类时,它们都会产生开销,这会增加GC暂停时间

    然而,运行时开销的问题通常应该是正确性问题的次要问题

    • 如果在应该使用
      WeakHashMap
      时使用
      HashMap
      ,则很可能会遇到堆填充问题。这也存在性能问题

    • 如果您在应该使用
      HashMap
      的位置使用
      WeakHashMap
      ,则可能会丢失信息


    你明白WeakReference是什么意思吗?究竟什么时候才有资格获得GC?您不能用WeakHashMaps替换所有HashMaps。。。他们都有不同的行为…另请参见和
    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)