1. 程式人生 > >java中散列表、樹所對應的的容器類。HashMap如何解決衝突

java中散列表、樹所對應的的容器類。HashMap如何解決衝突

樹:hashset,treemap,treeset

HashMap如何解決衝突

1.開放定址法: 通過探測演算法,當一個槽位已經被佔用情況下繼續查詢下一個
2.鏈地址法(陣列+連結串列)
3.再雜湊 準備多個雜湊函式,當發生衝突時,再選擇一個雜湊函式進行雜湊。

Hash的工作原理

HashMap 底層是 hash 陣列單向連結串列實現,陣列中的每個元素都是連結串列,由 Node 內部類(實現 Map.Entry<K,V>介面)實現,HashMap 通過 put & get 方法儲存和獲取。

HashCode是定位(儲存位置),equals是定性(兩者是否相等)

儲存物件時,將K/V傳給put()方法:

    ①hash(K)計算K的hash,結合陣列長度,計算陣列下標

    ②調整資料大小(當容器中的元素個數大於 capacity * loadfactor 時,容器會進行擴容resize 為 2n)

    ③三種情況:

  • 當K的hash值不在HashMap中,則執行插入
  • 當K的hash值存在HashMap中,發生碰撞
    • 它們兩者equals為true,更新鍵值對
    • 它們兩者equals為false,插入連結串列尾部或紅黑樹(當連結串列長度超過8)中

獲取物件時(get方法):

     ①呼叫hash(K),計算K的hash值從而獲取陣列的下標

    ②順序遍歷連結串列,equal方法查詢相同 Node 連結串列中 K 值對應的 V 值