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

Is Map.containsKey() useful in a Map that has no null values?

在下面的一段代码中:

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

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

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

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

is it useful to first do a Map.containsKey() check before trying to remove the value from the map?

不行,适得其反:

  • 在物品不存在的情况下,您看不出有什么不同
  • 在项目存在的情况下,您最终会进行两次查找。

如果你想无条件删除该项目,只需调用map.remove(key)

Same question goes for retrieving values

同样的逻辑也适用于此。当然你需要检查 null 的结果,所以在这种情况下 if 留在那里。

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

remove returns null 如果 key 没有映射,则不会抛出异常:

public V remove(Object key)

我看不出有任何理由在尝试删除 key 之前执行 if,也许如果您想计算从地图中删除了多少项目..

在第二个示例中,如果 key 不存在,您将得到 null。查不查,看你的逻辑了。

尽量不要把时间浪费在考虑性能上,containsKeyO(1) time complexity:

This implementation provides constant-time performance for the basic operations (get and put)

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

这是主观的(并且完全是一种风格的情况),但对于您要检索值的情况,我更喜欢 contains(key) 调用而不是 null 检查。布尔比较感觉比空比较好。如果 Map<K,V>.get(key) 返回 Optional<V>,我可能会有不同的感觉。

另外,值得注意的是 "given no null keys" 断言是一个很难证明的断言,这取决于地图的类型(您甚至可能不知道)。总的来说,我认为对检索进行冗余检查(或者可能只是感觉)更安全,以防万一其他地方出现错误(敲木头,检查黑猫,避免梯子在出去的路上)。

对于删除操作,您完全正确。支票没用。