天天看點

HashMap put、get方法源碼分析

HashMap.java的實作是面試必問的問題。

JDK版本

1. HashMap節點的封裝

Node<K, V>

hash值算法

put null的key,計算hash值

ok,重點分析一下擴容

首先說幾點

1. 找tab位置,使用的key.hash() & (capacity - 1)

注意這裡用的是位運算與操作,這裡與的是capacity - 1,這樣結果就不可能超過capactity - 1。不僅保證了結果正确,性能也提供了很多

2. 擴容大小為原來的大小左移一位,即擴大為原來的兩倍

擴容主要的移動原來的元素,到新的數組裡面

這裡源碼使用了比較好的方法,用key的hash值與capacity進行與,注意不是capacity - 1。如果與的結果是0,說明在新數組中的位置為原來的位置,不用變。如果結果不為0,最高為1,即capacty,說明在新數組中的位置為原來位置 + 原來的capacity

以前面試也被問道過,當時自信滿滿的胡說。自認為了解的很清楚,這裡糾正一下

1. 封裝的節點為Node,不是Entity

2. 擴容為大小為原來的兩倍

3. 計算在數組位置,不是取餘,是采用位操作。hashcode & capactiy - 1,注意這裡的 - 1操作

4. put null的key,這裡是可以的,null的hash值為0

5. key的計算為object.hashcode() ^ (object.hashcode >>> 16)

先到這

 p.s.https://tech.meituan.com/java-hashmap.html這個寫的不錯