1. 程式人生 > >HashMap HashSet 原理詳解 與 對比

HashMap HashSet 原理詳解 與 對比

Hashmap

1.原理

陣列連結結構,put原理:首先計算key的hash值,找到table陣列中的位置,找到table[i]位置後,這個連結串列找是否有這個key值,使用equal()方法進行比較,有這個key值,那麼進行更改value操作,沒有這個key,那麼那麼就將新的鍵值對新增到連結串列的後面,完成put操作(備註:put操作最後會有modcount的值進行++,這是為了防止多執行緒時候出錯,遍歷的時候,使用迭代器,expectedModCount的值不一樣,說明發生執行緒不安全的現象,這時候裡面執行快速失敗fast-fail機制)
get()原理 get是通過key計算出hashcode然後利用hashcode找到陣列的下標,然後進入table[i]連結串列中,通過equal()方法比較key的值,如果找到則返回value
resize()原理

噹噹前的map的鍵值對的數目等於負載因子乘以容量 也就是說達到了閾值,那麼進行陣列的容量乘以2的操作。然後原map中的鍵值對重新計算每個key對應的hashcode值,然後對新的陣列的長度進行取模,找到在擴容後的陣列下標,將鍵值對插入進去。

2.引數

HashMap是通過”拉鍊法”實現的雜湊表。它包括幾個重要的成員變數:table, size, threshold, loadFactor, modCount。
  table是一個Entry[]陣列型別,而Entry實際上就是一個單向連結串列。雜湊表的”key-value鍵值對”都是儲存在Entry陣列中的。
  size是HashMap的大小,它是HashMap儲存的鍵值對的數量。
  threshold是HashMap的閾值,用於判斷是否需要調整HashMap的容量。threshold的值=”容量*載入因子”,當HashMap中儲存資料的數量達到threshold時,就需要將HashMap的容量加倍。
  loadFactor就是載入因子。
  modCount是用來實現fail-fast機制的。

HashSet

hashSet就是基於hashmap實現的,比如說hashset的add方法,它的add方法比如進來一個類(類的物件要不可變)的物件,那麼其實底層就是hashmap的key是這個物件,通過計算這個物件的hashcode值,找到陣列的位置,然後通過equals進行比較,如果比較沒有,那麼就add成功,如果比較成功,說明這個key有了,也就是說set集合中有這個物件了、不再新增。
其它的函式都是這樣的,基於hashmap

Hashset與hashMap對比