在HashMap中检查键是否存在总是必要的吗?

我有一个HashMap,有1000个条目,我正在考虑提高效率。 如果HashMap被非常频繁地访问,那么在每次访问时检查键是否存在将导致很大的开销。相反,如果键不存在,因此发生了异常,则可以捕获异常。(当我知道这种情况很少发生时)。这将减少一半对HashMap的访问。

这可能不是一个好的编程实践,但它将帮助我减少访问次数。还是我漏了什么?

我在HashMap中没有空值。


当前回答

从java 1.8开始,你可以简单地使用:

var item = mapObject.getOrDefault(key, null);
if(item != null)

其他回答

为了清晰起见,只需使用containsKey()。这是快速的,并保持代码干净和可读。HashMaps的关键在于键查找速度快,只需确保hashCode()和equals()被正确实现。

从java 1.8开始,你可以简单地使用:

var item = mapObject.getOrDefault(key, null);
if(item != null)

我通常使用成语

Object value = map.get(key);
if (value == null) {
    value = createValue(key);
    map.put(key, value);
}

这意味着如果钥匙丢失,你只需要点击地图两次

通过检查密钥是否存在,您不会获得任何东西。这是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源代码很好

如果键类是你的,确保hashCode()和equals()方法实现。 基本上对HashMap的访问应该是O(1),但如果hashCode方法实现错误,它就变成了O(n),因为具有相同哈希键的值将存储为链表。