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這個寫的不錯