2019.7.11 HashMap的工作原理?

HashMap基於hashing原理,通過put()和get()存儲和獲得對象。
put(),調用hashCode()獲得hashcode,然後找到bucket位置來儲存值對象
get(),通過鍵對象的equals()方法找到正確的鍵值對,然後返回值對象

(1)什麼叫bucket?
當系統開始初始化 HashMap 時,系統會創建一個長度爲 capacity 的 Entry 數組,這個數組裏可以存儲元素的位置被稱爲“桶(bucket)”,每個 bucket 都有其指定索引,系統可以根據其索引快速訪問該 bucket 裏存儲的元素。

  • capacity爲當前HashMap的Entry數組的大小,Entry數組的大小是2的N次方
  • threshold爲HashMap的size最大值,注意不是HashMap內部數組的大小。
    threshold = (int)(capacity * loadFactor);
    在這裏插入圖片描述 存儲示意

(2)什麼是負載因子(load factor)
當創建 HashMap 時,有一個默認的負載因子(load factor),其默認值爲 0.75,這是時間和空間成本上一種折衷:增大負載因子可以減少 Hash 表(就是那個 Entry 數組)所佔用的內存空間,但會增加查詢數據的時間開銷,而查詢是最頻繁的的操作(HashMap 的 get() 與 put() 方法都要用到查詢);減小負載因子會提高數據查詢的性能,但會增加 Hash 表所佔用的內存空間。

(3)HashMap的碰撞問題
不同的鍵對象有相同的hashcode值時,會發生碰撞,使用單向鏈表解決碰撞問題。它們會儲存在同一個bucket位置的鏈表中。
當衝突發生時,使用某種探查技術在散列表中形成一個探查(測)序列。沿此序列逐個單元地查找,直到找到給定的地址。
按照形成探查序列的方法不同,可將開放定址法區分爲線性探查法二次探查法雙重散列法等。

(4)HashMap 的讀取實現
當 HashMap 的每個 bucket 裏存儲的 Entry 只是單個 Entry ——也就是沒有通過指針產生 Entry 鏈時,此時的 HashMap 具有最好的性能:當程序通過 key 取出對應 value 時,系統只要先計算出該 key 的 hashCode() 返回值,在根據該 hashCode 返回值找出該 key 在 table 數組中的索引,然後取出該索引處的 Entry,最後返回該 key 對應的 value 即可。如果發生了碰撞問題,單個 bucket 裏存儲的不是一個 Entry,而是一個 Entry 鏈,系統只能必須按順序遍歷每個 Entry,直到找到想搜索的 Entry 爲止——如果恰好要搜索的 Entry 位於該 Entry 鏈的最末端(該 Entry 是最早放入該 bucket 中),那系統必須循環到最後才能找到該元素。

原文鏈接:https://blog.csdn.net/wenyiqingnianiii/article/details/52204136

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章