Проверьте наличие ключа 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,

Нет разницы между этими двумя подходами. Основное отличие только в том, что вы собираетесь делать дальше. Если вам нужно это значение, то, конечно, вы получите значение.

Другие вопросы по тегам