在Java中HashMap.containsKey()的时间复杂度是多少?

时间:2012-01-19 08:49:46

标签: java performance hashmap time-complexity

我需要知道:java中HashMap.containsKey()的时间复杂度是多少?

4 个答案:

答案 0 :(得分:53)

来自API doc ofHashMap

  

此实现为基本提供了恒定时间性能   操作(获取和放置),假设散列函数分散了   桶中的元素。

由于containsKey()只是一个get()抛弃了检索到的值,所以它是O(1)(假设哈希函数再次正常工作)。

答案 1 :(得分:13)

通常是O(1),但是如果我们使用一个糟糕的hashCode函数,我们需要在一个桶中添加多个元素,因此在最坏的情况下它可以是O(n)。

答案 2 :(得分:8)

一般来说是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       }

答案 3 :(得分:5)

containsKey的时间复杂度在 JDK-1.8 中发生了变化,正如其他人所说,在理想情况下它是O(1)。但是,如果keysComparable的碰撞,存储碰撞元素的区域在超过某个名为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中的那些)来存储箱子(即:红黑树结构),这给我们留下了{{1}碰撞时的复杂性。

同样适用于O(lgn),其中两个方法都在内部调用get(key)

注意: n 此处是getNode的尺寸,而不是bin