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

问题描述:

在下面的代码:Map.containsKey()在没有空值的Map中有用吗?

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

看演出,是非常有用试图从地图中删除值之前先做一个Map.containsKey()检查?

对于检索值也有同样的问题,如果知道地图不包含null值,首先执行包含检查会有用吗?

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

即使存在空键,第一个示例也是冗余的。 – 2015-02-10 11:46:53

+0

哪个JDK实现? – aioobe 2015-02-10 11:47:23

remove回报null如果有一个为key没有映射任何异常将被抛出:

public V remove(Object key) 

我看不出有任何理由试图删除key,也许,也许,如果你想之前执行if请计算从地图中删除的项目数量。

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

尽量不要浪费你的时间考虑性能,containsKeyO(1) time complexity

此实现恒定时间表现为基本操作(getput

是有用的,首先做一个Map.containsKey()试图从地图中删除前值检查?

不,这是适得其反:

  • 在这种情况下,当该项目不存在,你会看到没有什么区别
  • 在这种情况下,当产品出现,你最终会两个查找。

如果您要无条件移除物品,只需拨打map.remove(key)即可。

同样的问题也适用于检索值

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

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

的关于remove()的Java文档声明,只有当映射包含这样的元素时,它才会删除该元素。所以在remove()之前检查是多余的。

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

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

对于您正在使用的移除操作。该支票是无用的。