代码之家  ›  专栏  ›  技术社区  ›  tom

效率:HashMap检查containsKey()与always put()的比较

  •  0
  • tom  · 技术社区  · 7 年前

    如果我有一个HashMap,并且我想插入包含大量重复项的键值对,那么最好执行以下操作: if (!map.containsKey(key)) map.put(key, value); map.put(key,value); 不管键/值对是否已经存在?

    5 回复  |  直到 7 年前
        1
  •  2
  •   Debosmit Ray    7 年前

    map.put(key, value); . 这样,就不需要进行额外的O(1)查找(包括对 key 然后检查它是否存在)。

    在最坏的情况下,这可以为您节省大约 n-1 (key, value)

        2
  •  2
  •   Tom Hawtin - tackline    7 年前

    几乎可以肯定的是,这没有真正的区别。首先让代码正确。配置文件(您似乎没有这样做,或者您知道这个案例)。不要随意地优化/混淆东西,因为这似乎是个好主意。

    通常,最大的性能损失是加载和编译代码。因此,最短、最简单的代码可能已经是最优的了。

        3
  •  2
  •   Saptarshi Basu    7 年前

    你应该使用这个方法 putIfAbsent . 如果您担心覆盖该值。此方法在Java8以后的版本中可用。

    它的时间复杂性与 put .

    如果可以用最新值覆盖,只需选择 .

        4
  •  1
  •   Mr.Yellow    7 年前

    put contain 具有相同的渐近运行时间,因此在最大情况下使用这两种方法将增加2倍,这是恒定的。因此,您的渐近运行时间不会改变。但是自从 将只覆盖任何现有值(甚至返回旧值,以及 null 如果它是新的),它是这个2倍因子更快。

        5
  •  1
  •   azro    7 年前

    Map::put 覆盖具有相同密钥的条目,因此使用 .put 不检查映射是否已包含密钥。