原始碼分析 HashMap 1 8

2022-07-20 12:24:10 字數 1822 閱讀 5733

1.0 資料結構

2.0 儲存流程

3.0 陣列元素 & 鍊錶節點的實現類

hashmap中的陣列元素 & 鍊錶節點 採用node類 實現,與jdk1.7相比只是把entry換了個名字 

hashmap中的紅黑樹節點 採用treenode類 實現

/**

* 紅黑樹節點 實現類:繼承自linkedhashmap.entry類

*/static

final

class treenodeextends linkedhashmap.entry

//返回當前節點的根節點

final treenoderoot()

}

4.0 原始碼分析

4.1 hash擾動函式的變更

4.2put函式變更

/**

* 分析2:putval(hash(key), key, value, false, true)

*/final v putval(int hash, k key, v value, boolean

onlyifabsent,

boolean

evict)

//對於i

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

break

;

//更新p指向下乙個節點,繼續遍歷

p =e;}}

//對i情況的後續操作:發現key已存在,直接用新value 覆蓋 舊value & 返回舊value

if (e != null

) }

++modcount;

//插入成功後,判斷實際存在的鍵值對數量size > 最大容量threshold

//若 > ,則進行擴容 ->>分析4(但單獨講解,請直接跳出該**塊)

if (++size >threshold)

resize();

afternodeinsertion(evict);

//插入成功時會呼叫的方法(預設實現為空)

return

null;}

/*** 分析3:puttreeval(this, tab, hash, key, value)

* 作用:向紅黑樹插入 or 更新資料(鍵值對)

* 過程:遍歷紅黑樹判斷該節點的key是否與需插入的key 相同:

* a. 若相同,則新value覆蓋舊value

* b. 若不相同,則插入

*/final treenodeputtreeval(hashmapmap, node tab,

inth, k k, v v)

dir =tiebreakorder(k, pk);

}treenode

xp =p;

if ((p = (dir <= 0) ? p.left : p.right) == null

) }

}

總結 put方法流程

HashMap1 8原始碼分析

1 hashmap的原理,內部資料結構如何?底層使用雜湊表 陣列 鍊錶 當鍊表過長 其實是大於8 的時候會將鍊錶轉換成紅黑樹,以實現n log n 的查詢。2 具體過程 對 key 求 hash 值,然後再計算 下標。如果沒有碰撞,直接放入桶中,如果碰撞了,以鍊錶的方式鏈結到後面,如果鍊錶長度超過閥...

HashMap 1 8 原始碼閱讀

一 初始化 1.無參建構函式 負載因子預設值 static final float default load factor 0.75f 指定loadfactor負載因子的值是0.75f public hashmap 2.指定初始化大小和負載因子 hashmap的最大容量 static final i...

JDK原始碼分析系列 HashMap 1 8

預設的初始化容量,必須是2的n次冪 static final int default initial capacity 1 4 aka 16 最大的容量是2的30次冪 static final int maximum capacity 1 30 預設的負載因子 static final float ...