【问题标题】:Is it faster to check if a map contains a key or just put that value?检查地图是否包含键或仅放置该值是否更快?
【发布时间】:2016-09-02 17:42:51
【问题描述】:

如果我知道输入到地图条目中的值是相同的,我最好检查它是否不在地图中或只是进行放置? 也就是说,是

if (!map.containsKey(key)){
    map.put(key, value);
}

如果我知道键的值是相同的,那比只做map.put(key, value) 更好。

背景: 我正在尝试计算将 id 映射到一组整数的地图的所有重叠。例如:给定{A:1,2,3; B:2,4,6; C:2,3,4; D:1,3,5},我需要得到这张地图:{AnB:2; AnC:2,3; AnD:1,3; BnC:2,4; AnBnC:2; AnCnD:3;}。递归地执行此操作不是一种选择,因为对于我们运行堆空间的较大集合。所以我通过将下一个“层”添加到现有层来迭代地进行。所以为了得到 AnBnC,我使用 AnB 并计算与 C 的交集。但这也意味着我使用 AnC 并计算与 B 的交集,这将给出相同的结果。

谢谢!

【问题讨论】:

  • 你觉得哪一个更简单/更清晰?你应该使用那个。执行两项操作可能比一项慢。
  • 刚刚将其编辑为 if !containsKey,因此无论哪种方式它仍然是一个操作。
  • 在 java-8 中考虑 Map#putIfAbsent
  • containsKey 是一项操作,所以如果您执行其他任何操作会产生多个操作。

标签: java hashmap set


【解决方案1】:

我不确定你的直接问题的答案,即哪个更快,但如果你想优化,我建议避免做不必要的设置交叉点。类似的东西;

intersectionKey = setA.key + setB.key;
if (!map.containsKey(intersectionKey)) {
    intersection = A | B;
    map.put(intersectionKey, intersection);
}

【讨论】:

  • 谢谢。我现在意识到我没有考虑这完全改变事情的部分。
【解决方案2】:

这取决于您使用的是哪个地图?

https://docs.oracle.com/javase/7/docs/api/java/util/Map.html#put(K,%20V)

Map.put API 会返回之前的值。 因此,put() API self 必须比 get() 昂贵,而 get() 必须比 contains() 昂贵。

简而言之,.put 对于基本的 HashMap / TreeMap 实现会更快。

但是,它可能是 ConcurrentMap 的一个例外,它们的实现可能会尝试优化线程本地或避免多线程环境中的锁定开销。

顺便说一句,但如果我是你的话。如果可能,我将使用 BitSet 来优化内存使用和性能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-10
    • 2013-08-04
    • 1970-01-01
    • 2011-01-04
    • 2022-01-05
    • 1970-01-01
    • 2011-03-09
    相关资源
    最近更新 更多