Проверьте наличие ключа HashMap
В Java полное заполнение HashMap данными такой формы:
HashMap<Integer, int[]> map = new HashMap<Integer, int[]>(1000000, 1);
что быстрее при проверке наличия случайного ключа, скажем 100:
if (map.get(100) == null))
или же
if (!map.containsKey(100))
?
Вопрос интересен с точки зрения микрооптимизации.
4 ответа
containsKey
должно быть немного медленнее, потому что это приводит к дополнительному вызову функции (это просто вызывает getEntry
) (это может быть оптимизировано, я не уверен, будет ли это делать Java). containsKey
похоже:
public boolean containsKey(Object key) {
return getEntry(key) != null;
}
Но учтите, что containsKey
с другой стороны, может быть немного быстрее других Map
реализации (но, вероятно, не те, что в стандартном Java API).
Вообще мои реализации выглядят так: (избегая необходимости containsKey
)
int[] arr = map.get(100);
if (arr == null) // doesn't exist
// do stuff
else // exists
// do stuff with arr
Ниже будет определенно медленнее, чем выше: (если элементы, которые вы ищете, существуют разумное количество времени)
if (!map.containsKey(100)) // doesn't exist
// do stuff
else // exists
{
int[] arr = map.get(100);
// do stuff with arr
}
Изменить: Спасибо zvzdhk за предоставление источника containsKey
, Я должен был проверить.
На самом деле оба подхода одинаковы. Если вы посмотрите в java.util.HashMap
Исходный код, который вы можете найти следующей реализацией содержит ключ:
public boolean containsKey(Object key) {
return getEntry(key) != null;
}
Два отличается только return
типа кроме этого map.get(key)
может вернуть вам null
в случае если его ключ, однако map.containsKey(key)
вернет тебя boolean
который может быть использован, чтобы расстроить два возможных случая map.get(key)
возврате null
,
Нет разницы между этими двумя подходами. Основное отличие только в том, что вы собираетесь делать дальше. Если вам нужно это значение, то, конечно, вы получите значение.