JDK原始碼學習之HashMap的put函式實現

2021-10-02 22:16:18 字數 1136 閱讀 6731

使用key的雜湊值和key雜湊值的低16為進行按位異或操作,得到hash值

static

final

inthash

(object key)

public v put

(k key, v value)

因為雜湊桶陣列的大小為2的整數次冪,因此 i = (n - 1) & hash就是應該插入的桶的索引。

但是索引位置的桶裡面可能不只有乙個元素,也有可能雜湊桶中存的就是這個資料,所以需要繼續進行判斷。

如果對應桶裡面為null,那就直接建立乙個新的桶。

如果不為null,那麼來看一下第乙個位置是不是當前要插入的值。

如果不是,那就看一下是不是紅黑樹,如果是,那就進行紅黑樹的插入操作

如果不是紅黑樹,那就找一下桶裡面有沒有自己,如果沒有,那就把新的元素放在桶的尾部,也就是鍊錶的尾部。在插入後,看一下是不是達到了轉換閾值,如果達到了轉換閾值,那就把鍊錶轉換為紅黑樹。

/**

* 三個比較有用的變數,hash,key,value.

* */

final v putval

(int hash, k key, v value,

boolean onlyifabsent,

boolean evict)

//看一下新的元素是不是已經在雜湊桶陣列的這個桶裡面,如果是,那就結束了

if(e.hash == hash &&

((k = e.key)

== key ||

(key != null && key.

equals

(k))))

break

; p = e;

//再找一下桶裡的下乙個元素}}

if(e != null)

}++modcount;if(

++size > threshold)

//雜湊桶陣列大小超過閾值,進行擴容

resize()

;afternodeinsertion

(evict)

;return null;

}

JDK原始碼學習之集合

collection介面所有集合類的最頂層介面。從網上找到了乙個uml類圖感覺不錯。接下來會仔細閱讀arraylist,linkedlist,hashset,treeset,甚至更多。先分析這幾個的原因,主要是因為比較常用。1.int size 返回集合中的元素總數 2.boolean isempt...

原始碼解析 JDK原始碼之LinkedHashMap

linkedhashmap原始碼,基於 jdk1.6.43 他繼承了hashmap,並且實現了插入和訪問的有序功能 public class linkedhashmapextends hashmapimplements map 其也有乙個entry內部類,繼承了 hashmap 的entry 內部類...

JDK原始碼之Map

1.hashmap hashmap初始化的方式有四種。建立乙個entry陣列,預設初始長度為16,當大於0.75的時候,擴充套件為當前的2倍。有4中初始化map的方式。mapmap new hashmap mapmap2 new hashmap 17 mapmap3 new hashmap 15,2...