1. 程式人生 > >面試中關於HashMap的時間複雜度O(1)的思考

面試中關於HashMap的時間複雜度O(1)的思考

今天在面試的時候說到HashMap,面試官問了這麼一個問題:你說HashMap的get迭代了一個連結串列,那怎麼保證HashMap的時間複雜度O(1)?連結串列的查詢的時間複雜度又是多少?
在這之前我是閱讀過HashMap的原始碼的:Java7原始碼淺析——對HashMap的理解
由上一個部落格可知我們對HashMap的查詢,如原始碼所示:

    public V get(Object key) {  
        if (key == null)  
            return getForNullKey();  
        int hash = hash(key.hashCode());  
        for
(Entry<K,V> e = table[indexFor(hash, table.length)]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || key.equals(k))) return e.value; } return null; }

分四步:
1.判斷key,根據key算出索引。
2.根據索引獲得索引位置所對應的鍵值對連結串列。
3.遍歷鍵值對連結串列,根據key找到對應的Entry鍵值對。
4.拿到value。
分析:
以上四步要保證HashMap的時間複雜度O(1),需要保證每一步都是O(1),現在看起來就第三步對連結串列的迴圈的時間複雜度影響最大,連結串列查詢的時間複雜度為O(n),與連結串列長度有關。我們要保證那個連結串列長度為1,才可以說時間複雜度能滿足O(1)。但這麼說來只有那個hash演算法儘量減少衝突,才能使連結串列長度儘可能短,理想狀態為1。因此可以得出結論:HashMap的查詢時間複雜度只有在最理想的情況下才會為O(1),而要保證這個理想狀態不是我們開發者控制的。