JAVA8 Hashmap的原始碼學習總結

2021-09-24 10:04:32 字數 2267 閱讀 1737

hashmap作為常用的集合之一,必須深入的了解和學習,同時也是面試的經常考點之一。

hashmap在jdk1.8以後採用陣列+鍊錶+紅黑樹的結構來儲存資料,首先介紹下hashmap的概念:

1.引數概念

預設初始化容量 16

static final int default_initial_capacity = 1 << 4;

最大容量 2的30次方

static final int maximum_capacity = 1 << 30;

預設的負載因子 0.75

static final float default_load_factor = 0.75f;

當某個桶的數量大於8時,會轉化為紅黑樹。

static final int treeify_threshold = 8;

當某個桶節點數量小於6時,會轉換為鍊錶,前提是它當前是紅黑樹結構。

static final int untreeify_threshold = 6;

當整個hashmap中元素數量大於64時,也會進行轉為紅黑樹結構。

static final int min_treeify_capacity = 64;

2.基本概念

node tab; node陣列

nodenode類

3.現在對hashmap的主要方法進行分析:put方法分析

final v putval(int hash, k key, v value, boolean onlyifabsent,

boolean evict)

key值相等就覆蓋

if (e.hash == hash &&

((k = e.key) == key || (key != null && key.equals(k))))

break;

p = e;}}

v oldvalue = e.value;

if (!onlyifabsent || oldvalue == null)

e.value = value;

afternodeaccess(e);

return oldvalue;}}

++modcount;

超過最大容量就擴容

resize方法分析:

final node resize() 

當它擴容2倍後,新的陣列大小小於最大容量時,同時舊的陣列大小大於預設陣列大小。

else if ((newcap = oldcap << 1) < maximum_capacity &&

oldcap >= default_initial_capacity)

newthr = oldthr << 1; // double threshold

}當陣列等於0時,同時臨界值大於0時,臨界值賦值給新的陣列

else if (oldthr > 0) // initial capacity was placed in threshold

newcap = oldthr;

else

如果臨界值等於0,初始化臨界值

if (newthr == 0)

臨界值賦值

threshold = newthr;

@suppresswarnings()

node newtab = (node)new node[newcap];

table = newtab;

if (oldtab != null)

else

} while ((e = next) != null);

if (lotail != null)

if (hitail != null) }}

}}return newtab;

}

Java8 PriorityQueue 原始碼解析

前世今生 extends abstractqueue abstractqueue extends abstractcollection implements queue 實現原理大白話 內部使用你所熟悉的資料結構最堆來實現,每次都是取堆頂的元素。至於堆怎麼實現,其實很簡單,就乙個陣列而已,這裡就不討...

HashMap 的 get 方法的流程分析(原始碼)

流程首先根據 hash 方法獲取到 key 的 hash 值 然後通過 hash length 1 的方式獲取到 key 所對應的node陣列下標 length對應陣列長度 首先判斷此結點是否為空,是否就是要找的值,是則返回空,否則進入第二個結點。接著判斷第二個結點是否為空,是則返回空,不是則判斷此...

ConcurrentHashMap的原始碼分析

put final v putval k key,v value,boolean onlyifabsent 在上一步的else if中 f 不為null時,則判斷f的hash值是否為moved,即 1,如果為 1,表示正在擴容 else if fh f.hash moved 協助資料遷移 tab h...