當前位置:編程學習大全網 - 源碼下載 - HashMap原理 — 擴容機制及存取原理

HashMap原理 — 擴容機制及存取原理

回顧壹下基本概念:

壹. put方法

HashMap使用哈希算法得到數組中保存的位置,然後調用put方法將key-value對保存到table變量中。我們通過圖來演示壹下存儲的過程。

簡單解釋壹下:

我們關註壹下這裏面最重要的三個方法,hash(),putVal(),resize().

1. hash方法

我們通過hash方法計算索引,得到數組中保存的位置,看壹下源碼

我們可以看到HashMap中的hash算法是通過key的hashcode值與其hashcode右移16位後得到的值進行異或運算得到的,那麽為什麽不直接使用key.hashCode(),而要進行異或操作?我們知道hash的目的是為了得到進行索引,而hash是有可能沖突的,也就是不同的key得到了同樣的hash值,這樣就很容易產業碰撞,如何減少這種情況的發生呢,就通過上述的hash(Object key)算法將hashcode 與 hashcode的低16位做異或運算,混合了高位和低位得出的最終hash值,沖突的概率就小多了。舉個例子:

我們的hash(Object key)算法壹個道理,最終的hash值混合了高位和低位的信息,摻雜的元素多了,那麽最終hash值的隨機性越大,而HashMap的table下標依賴於最終hash值與table.length()-1的&運算,這裏的&運算類似於挑包子的過程,自然沖突就小得多了。計算過程如下:

2. putVal方法

通過putVal方法將傳遞的key-value對添加到數組table中。

3. resize方法

HashMap通過resize()方法進行擴容,容量規則為2的冪次

二. get方法

我們先簡單說壹下get(Object key)流程,通過傳入的key通過hash()算法得到hash值,在通過(n - 1) & hash找到數組下標,如果數組下標所對應的node值正好key壹樣就返回,否則找到node.next找到下壹個節點,看是否是treenNode,如果是,遍歷紅黑樹找到對應node,如果不是遍歷鏈表找到node。我們看壹下源碼

這幾個方法是核心,雖然HashMap還有很多常用方法,不過大體和這幾個方法有關,或者實現邏輯相似,這裏就不再多說了。

三. 總結

本文在上壹章基本概念和底層結構的基礎上,從源碼的角度講解了擴容機制以及存取原理,主要分析了put方法和get方法,put方法的核心為hash(),putVal(),resize(),get方法的核心為getNode()。

  • 上一篇:財務分析需要哪些數據
  • 下一篇:如何在opencv中使用NCC算法判斷兩幅圖像的相似度?
  • copyright 2024編程學習大全網