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);
}
remove
回报null
如果有一个为key
没有映射任何异常将被抛出:
public V remove(Object key)
我看不出有任何理由试图删除key
,也许,也许,如果你想之前执行if
请计算从地图中删除的项目数量。
在第二个示例中,如果key
不存在,您将获得null
。是否要检查,取决于你的逻辑。
尽量不要浪费你的时间考虑性能,containsKey
有O(1) time complexity:
此实现恒定时间表现为基本操作(
get
和put
)
是有用的,首先做一个Map.containsKey()试图从地图中删除前值检查?
不,这是适得其反:
- 在这种情况下,当该项目不存在,你会看到没有什么区别
- 在这种情况下,当产品出现,你最终会两个查找。
如果您要无条件移除物品,只需拨打map.remove(key)
即可。
同样的问题也适用于检索值
同样的逻辑也适用于这里。当然,您需要检查null
的结果,因此在这种情况下if
会保留在那里。
请注意,此清理练习首先关于可读性,然后才是关于性能。访问地图是一项快速操作,因此访问它两次不会导致主要的性能问题,除了一些极端的情况。但是,删除额外的条件将使您的代码更具可读性,这非常重要。
的关于remove()
的Java文档声明,只有当映射包含这样的元素时,它才会删除该元素。所以在remove()
之前检查是多余的。
这是主观的(并且完全是风格的一种情况),但对于您要检索值的情况,我更喜欢contains(key)
调用空检查。布尔比较感觉比空比较好。如果Map<K,V>.get(key)
返回Optional<V>
,我可能会感觉不同。
此外,值得注意的是,“给定无空键”断言是一个相当难以证明的断言,取决于Map类型(您甚至可能不知道)。一般来说,我认为冗余检查检索(或者只是感觉)更安全,以防万一其他地方出现错误(敲木头,检查黑猫,并避免出现*)。
对于您正在使用的移除操作。该支票是无用的。
即使存在空键,第一个示例也是冗余的。 – 2015-02-10 11:46:53
哪个JDK实现? – aioobe 2015-02-10 11:47:23