Map.containsKey()在没有空值的Map中有用吗?

时间:2015-02-10 11:45:11

标签: java performance hashmap

在下面的代码中:

if (map.containsKey(key)) {
    map.remove(key);
}

考虑性能,在尝试从地图中删除值之前先进行Map.containsKey()检查是否有用?

同样的问题是检索值,如果您知道地图不包含null值,首先执行包含检查是否有用?

if (map.containsKey(key)) {
    Object value = map.get(key);
}

4 个答案:

答案 0 :(得分:6)

remove返回null如果key没有映射,则不会抛出任何异常:

public V remove(Object key)

在尝试删除if之前,我认为没有理由执行key,也许您可​​能想要计算从地图中删除的项目数量。

在第二个示例中,如果null不存在,您将获得key。是否检查,取决于你的逻辑。

尽量不要浪费时间考虑效果,containsKeyO(1) time complexity

  

此实施为基本操作(getput)提供常量性能

答案 1 :(得分:4)

  

在尝试从地图中删除值之前首先执行Map.containsKey()检查是否有用?

不,这会适得其反:

  • 如果项目不存在,您将看不到差异
  • 如果项目在那里,您最终会有两次查找。

如果您想无条件删除该项目,只需致电map.remove(key)

  

同样的问题是检索值

这里适用相同的逻辑。当然,您需要检查null的结果,因此在这种情况下if会停留在那里。

请注意,此清理练习首先是关于可读性,然后是关于性能的。访问地图是一种快速操作,因此访问它两次不太可能导致重大性能问题,除了一些相当极端的情况。但是,删除额外的条件将使您的代码更具可读性,这非常重要。

答案 2 :(得分:0)

remove()上的Java文档声明只有在地图包含此元素时才会删除该元素。因此,contains()之前的remove()检查是多余的。

答案 3 :(得分:0)

这是主观的(完全是样式的情况),但是对于您正在检索值的情况,我更喜欢contains(key)调用空检查。布尔比较感觉比空比较好。如果Map<K,V>.get(key)返回Optional<V>,我可能会有不一样的感受。

此外,值得注意的是&#34;没有空键&#34;断言是一个相当难以证明的断言,取决于Map的类型(您可能甚至不知道)。一般来说,我认为对检索的冗余检查是(或者只是感觉)更安全,以防万一其他地方出现错误(敲木头,检查黑猫,避免爬梯子)在出去的路上)。

对于删除操作,您可以发现。检查没用。