繁体   English   中英

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);
}

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

public V remove(Object key)

我看不出有任何理由来执行if试图删除前key ,也许也许,如果要统计有多少个项目,其中从地图上删除..

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

尽量不要浪费你的时间考虑性能, containsKeyO(1)时间复杂度

此实现为基本操作提供恒定时间性能( getput

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

不,这会适得其反:

  • 如果物品不在那里,你会看到没有区别
  • 如果物品在那里,你最终会有两个查找。

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

同样的问题是检索值

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

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

remove()上的Java文档声明只有在map包含这样的元素时才会删除元素。 所以remove()之前的contains()检查是多余的。

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

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

对于移除操作,您可以找到。 检查没用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM