Подтвердить что ты не робот

Какова временная сложность HashMap.containsKey() в java?

Мне нужно знать: Какова временная сложность HashMap.containsKey() в java?

4b9b3361

Ответ 1

Из API doc of HashMap:

Эта реализация обеспечивает постоянную производительность для основных операции (get и put), предполагая, что хэш-функция рассеивает элементов правильно среди ведер.

Так как containsKey() - это всего лишь get(), который отбрасывает полученное значение, то O (1) (если функция хэша работает правильно, снова).

Ответ 2

Обычно O (1), но если мы используем функцию bad hashCode, нам нужно добавить несколько элементов в один ведро, чтобы в худшем случае быть O (n).

Ответ 3

Это O(1) в целом, однако в худшем случае это O(n)

 public boolean containsKey(Object key) {
  352           return getEntry(key) != null;
  353       }
  354   
  355       /**
  356        * Returns the entry associated with the specified key in the
  357        * HashMap.  Returns null if the HashMap contains no mapping
  358        * for the key.
  359        */
  360       final Entry<K,V> getEntry(Object key) {
  361           int hash = (key == null) ? 0 : hash(key.hashCode());
  362           for (Entry<K,V> e = table[indexFor(hash, table.length)];
  363                e != null;
  364                e = e.next) {
  365               Object k;
  366               if (e.hash == hash &&
  367                   ((k = e.key) == key || (key != null && key.equals(k))))
  368                   return e;
  369           }
  370           return null;
  371       }

Ответ 4

Временная сложность containsKey изменилась в JDK-1.8, так как другие отметили, что она O(1) в идеальных случаях. Однако в случае столкновений, где keys Comparable, бинды, хранящие элементы столкновения, уже не линейны, после того как они превышают некоторый порог, называемый TREEIFY_THRESHOLD, который равен 8,

/**
 * The bin count threshold for using a tree rather than list for a
 * bin.  Bins are converted to trees when adding an element to a
 * bin with at least this many nodes. The value must be greater
 * than 2 and should be at least 8 to mesh with assumptions in
 * tree removal about conversion back to plain bins upon
 * shrinkage.
 */
static final int TREEIFY_THRESHOLD = 8;

Другими словами, TreeNodes будет использоваться (аналогично тем, что находится в TreeMap) для хранения корзин (т.е. красно-черной структуры дерева), и это оставляет нам сложность O(lgn) в случае столкновения.

То же самое относится к get(key), где оба метода вызывают getNode внутренне

Примечание: n - это размер bin, а не HashMap