在HashMap中检查键是否存在总是必要的吗?
我有一个HashMap,有1000个条目,我正在考虑提高效率。 如果HashMap被非常频繁地访问,那么在每次访问时检查键是否存在将导致很大的开销。相反,如果键不存在,因此发生了异常,则可以捕获异常。(当我知道这种情况很少发生时)。这将减少一半对HashMap的访问。
这可能不是一个好的编程实践,但它将帮助我减少访问次数。还是我漏了什么?
我在HashMap中没有空值。
在HashMap中检查键是否存在总是必要的吗?
我有一个HashMap,有1000个条目,我正在考虑提高效率。 如果HashMap被非常频繁地访问,那么在每次访问时检查键是否存在将导致很大的开销。相反,如果键不存在,因此发生了异常,则可以捕获异常。(当我知道这种情况很少发生时)。这将减少一半对HashMap的访问。
这可能不是一个好的编程实践,但它将帮助我减少访问次数。还是我漏了什么?
我在HashMap中没有空值。
当前回答
我通常使用成语
Object value = map.get(key);
if (value == null) {
value = createValue(key);
map.put(key, value);
}
这意味着如果钥匙丢失,你只需要点击地图两次
其他回答
为了清晰起见,只需使用containsKey()。这是快速的,并保持代码干净和可读。HashMaps的关键在于键查找速度快,只需确保hashCode()和equals()被正确实现。
if(map.get(key) != null || (map.get(key) == null && map.containsKey(key)))
如果键类是你的,确保hashCode()和equals()方法实现。 基本上对HashMap的访问应该是O(1),但如果hashCode方法实现错误,它就变成了O(n),因为具有相同哈希键的值将存储为链表。
你曾经存储空值吗?如果没有,你可以这样做:
Foo value = map.get(key);
if (value != null) {
...
} else {
// No such key
}
否则,你可以检查是否存在,如果你得到一个空值返回:
Foo value = map.get(key);
if (value != null) {
...
} else {
// Key might be present...
if (map.containsKey(key)) {
// Okay, there's a key but the value is null
} else {
// Definitely no such key
}
}
更好的方法是使用HashMap的containsKey方法。明天有人会把null添加到Map中。您应该区分键是否存在和键是否有空值。