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
。查不查,看你的逻辑了。
尽量不要把时间浪费在考虑性能上,containsKey
有 O(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" 断言是一个很难证明的断言,这取决于地图的类型(您甚至可能不知道)。总的来说,我认为对检索进行冗余检查(或者可能只是感觉)更安全,以防万一其他地方出现错误(敲木头,检查黑猫,避免梯子在出去的路上)。
对于删除操作,您完全正确。支票没用。
在下面的一段代码中:
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
。查不查,看你的逻辑了。
尽量不要把时间浪费在考虑性能上,containsKey
有 O(1) time complexity:
This implementation provides constant-time performance for the basic operations (
get
andput
)
remove()
上的 Java 文档指出,只有当地图包含该元素时,它才会删除该元素。因此 remove()
之前的 contains()
检查是多余的。
这是主观的(并且完全是一种风格的情况),但对于您要检索值的情况,我更喜欢 contains(key)
调用而不是 null 检查。布尔比较感觉比空比较好。如果 Map<K,V>.get(key)
返回 Optional<V>
,我可能会有不同的感觉。
另外,值得注意的是 "given no null keys" 断言是一个很难证明的断言,这取决于地图的类型(您甚至可能不知道)。总的来说,我认为对检索进行冗余检查(或者可能只是感觉)更安全,以防万一其他地方出现错误(敲木头,检查黑猫,避免梯子在出去的路上)。
对于删除操作,您完全正确。支票没用。