/*** initializes or doubles table size. if null, allocates in
* accord with initial capacity target held in field threshold.
* otherwise, because we are using power-of-two expansion, the
* elements from each bin must either stay at same index, or move
* with a power of two offset in the new table.
** @return the table
*/初始化或者擴容列表大小兩倍。如果列表為空,根據閾值字段分配初始 容量。否則,因為我們採用每次擴容兩倍的方式,擴容後每個桶中的元素在新錶中索引位置要不不變,要不偏移2的次冪。
final node
resize()
// 舊table擴容一倍 < 最大容量 同時 舊table的容量大於預設的初始容量
elseif(
(newcap = oldcap <<1)
< maximum_capacity &&
oldcap >= default_initial_capacity)
// 閾值擴容一倍
newthr = oldthr <<1;
// double threshold
}// 舊的閾值大於0
else
if(oldthr >0)
// initial capacity was placed in threshold
newcap = oldthr;
else
// 初始化table
if(newthr ==0)
threshold = newthr;
@suppresswarnings()
//使用新的容量大小初始化乙個新的table
node
newtab =
(node
)new
node
[newcap]
;// 賦值給table
table = newtab;
// 舊的table不為null
if(oldtab != null)
else
}while
((e = next)
!= null)
;// 拆分後第一條鍊錶的位置原位置
if(lotail != null)
// if
(hitail != null)}}
}}return newtab;
}
可以看到上述方法主要是針對在table擴容的時候處理table中的資料。首先我們可以看到每次擴容的後的容量為之前的兩倍。在針對table中每個元素 的處理主要分為普通的node,單項鍊表和紅黑樹,
擴容時,對於鍊錶會分為兩條新的鍊錶,這樣做在後續發生hash碰撞時,避免單條鍊錶長度過長,增加查詢時間,影響效能。
當單條鍊錶的長度小於6時,擴容時,會自動將紅黑樹在轉換為鍊錶結構。
先上**
final
void
split
(hashmap
map, node
tab,
int index,
int bit)
else}if
(lohead != null)}if
(hihead != null)
}}
HashMap 的 get 方法的流程分析(原始碼)
流程首先根據 hash 方法獲取到 key 的 hash 值 然後通過 hash length 1 的方式獲取到 key 所對應的node陣列下標 length對應陣列長度 首先判斷此結點是否為空,是否就是要找的值,是則返回空,否則進入第二個結點。接著判斷第二個結點是否為空,是則返回空,不是則判斷此...
跟著小甲魚學C語言 P53 位域
有些資料在儲存時並不需要占用乙個完整的位元組,只需要占用乙個或幾個二進位制位即可。例如微控制器開發中的開關只有通電和斷電兩種狀態,用 0 和 1 表示足以,也就是用乙個二進位。正是基於節省記憶體空間的考慮,c語言提供了一種叫做位域的資料結構。舉個例子 struct bs 後面的數字用來限定成員變數占...
HashMap知識點梳理 常見面試題和原始碼分析
本部落格是hashmap相關知識點博文鏈結的入口,從介紹hashmap的基本概念開始,到hashmap的應用 實現原理和常見面試題,包括分析其原始碼。雜湊表hashmap和雜湊函式介紹 hashmap之裝載因子 解決雜湊衝突的常用方法之開放定址法 雜湊函式的常用構造方法 hashmap的資料結構和原...