使用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...