在下面的代码中:
if (map.containsKey(key)) {
map.remove(key);
}
考虑性能,在尝试从地图中删除值之前先进行Map.containsKey()
检查是否有用?
同样的问题是检索值,如果您知道地图不包含null
值,首先执行包含检查是否有用?
if (map.containsKey(key)) {
Object value = map.get(key);
}
答案 0 :(得分:6)
remove
返回null
如果key
没有映射,则不会抛出任何异常:
public V remove(Object key)
在尝试删除if
之前,我认为没有理由执行key
,也许您可能想要计算从地图中删除的项目数量。
在第二个示例中,如果null
不存在,您将获得key
。是否检查,取决于你的逻辑。
尽量不要浪费时间考虑效果,containsKey
有O(1) time complexity:
此实施为基本操作(
get
和put
)提供常量性能
答案 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的类型(您可能甚至不知道)。一般来说,我认为对检索的冗余检查是(或者只是感觉)更安全,以防万一其他地方出现错误(敲木头,检查黑猫,避免爬梯子)在出去的路上)。
对于删除操作,您可以发现。检查没用。