在HashMap中检查键是否存在总是必要的吗?
我有一个HashMap,有1000个条目,我正在考虑提高效率。 如果HashMap被非常频繁地访问,那么在每次访问时检查键是否存在将导致很大的开销。相反,如果键不存在,因此发生了异常,则可以捕获异常。(当我知道这种情况很少发生时)。这将减少一半对HashMap的访问。
这可能不是一个好的编程实践,但它将帮助我减少访问次数。还是我漏了什么?
我在HashMap中没有空值。
在HashMap中检查键是否存在总是必要的吗?
我有一个HashMap,有1000个条目,我正在考虑提高效率。 如果HashMap被非常频繁地访问,那么在每次访问时检查键是否存在将导致很大的开销。相反,如果键不存在,因此发生了异常,则可以捕获异常。(当我知道这种情况很少发生时)。这将减少一半对HashMap的访问。
这可能不是一个好的编程实践,但它将帮助我减少访问次数。还是我漏了什么?
我在HashMap中没有空值。
当前回答
通过检查密钥是否存在,您不会获得任何东西。这是HashMap的代码:
@Override
public boolean containsKey(Object key) {
Entry<K, V> m = getEntry(key);
return m != null;
}
@Override
public V get(Object key) {
Entry<K, V> m = getEntry(key);
if (m != null) {
return m.value;
}
return null;
}
只需检查get()的返回值是否与null不同。
这是HashMap的源代码。
资源:
HashMap源代码糟糕的一个 HashMap源代码很好
其他回答
从java 1.8开始,你可以简单地使用:
var item = mapObject.getOrDefault(key, null);
if(item != null)
通过检查密钥是否存在,您不会获得任何东西。这是HashMap的代码:
@Override
public boolean containsKey(Object key) {
Entry<K, V> m = getEntry(key);
return m != null;
}
@Override
public V get(Object key) {
Entry<K, V> m = getEntry(key);
if (m != null) {
return m.value;
}
return null;
}
只需检查get()的返回值是否与null不同。
这是HashMap的源代码。
资源:
HashMap源代码糟糕的一个 HashMap源代码很好
if(map.get(key) != null || (map.get(key) == null && map.containsKey(key)))
更好的方法是使用HashMap的containsKey方法。明天有人会把null添加到Map中。您应该区分键是否存在和键是否有空值。
你是说你有代码
如果(map.containsKey(关键))doSomethingWith (map.get(关键))
到处都是?然后你应该简单地检查map.get(key)是否返回null,就是这样。 顺便说一下,HashMap不会因为缺少键而抛出异常,而是返回null。唯一需要使用containsKey的情况是存储空值,以区分空值和缺失值,但这通常被认为是不好的做法。