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