跟著小YI 學HashMap 原始碼(一)

2021-10-02 02:19:06 字數 1811 閱讀 8465

/*** 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的資料結構和原...