HashMap的內部結構與hash衝突

HashMap的內部結構

HashMap簡介:

  • HashMap繼承AbstractMap,AbstractMap實現Map接口
  • HashMap是線程不一樣步的,線程不安全的
  • HashMap能夠把null做爲條目的Key和value
  • HashMap性能好
  • 用做key的對象必須實現hashCode方法和equals方法
  • 不能保證鍵值對的順序
  • HashMap底層數據結構數組,鏈表,哈希表,紅黑樹

**************start  此處摘自 <http://www.cnblogs.com/chengxiao/>************數組

簡單來講,HashMap由數組+鏈表組成的,數組是HashMap的主體,鏈表則是主要爲了解決哈希衝突而存在的,若是定位到的數組位置不含鏈表(當前entry的next指向null),那麼對於查找,添加等操做很快,僅需一次尋址便可;若是定位到的數組包含鏈表,對於添加操做,其時間複雜度爲O(n),首先遍歷鏈表,存在即覆蓋,不然新增;對於查找操做來說,仍需遍歷鏈表,而後經過key對象的equals方法逐一比對查找。因此,性能考慮,HashMap中的鏈表出現越少,性能纔會越好。安全

 

 

*******end*********數據結構

 

看一下HashMap的put方法源碼

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

判斷當前肯定的索引位置是否存在相同hashcode和相同key的元素,若是存在相同的hashcode和相同的key的元素,那麼新值覆蓋原來的舊值,並返回舊值。 若是存在相同的hashcode,那麼他們肯定的索引位置就相同,這時判斷他們的key是否相同,若是不相同,這時就是產生了hash衝突。 Hash衝突後,那麼HashMap的單個bucket裏存儲的不是一個 Entry,而是一個 Entry 鏈。 系統只能必須按順序遍歷每一個 Entry,直到找到想搜索的 Entry 爲止——若是剛好要搜索的 Entry 位於該 Entry 鏈的最末端(該 Entry 是最先放入該 bucket 中), 那系統必須循環到最後才能找到該元素。

 *******ps:本人爲新手只是記錄本身的學習過程,若是有錯誤,但願大神指出,共同窗習**************性能

相關文章
相關標籤/搜索