1.0 資料結構
2.0 儲存流程
3.0 陣列元素 & 鍊錶節點的實現類
hashmap
中的陣列元素 & 鍊錶節點 採用node
類 實現,與jdk1.7相比只是把entry換了個名字
hashmap
中的紅黑樹節點 採用treenode
類 實現
/**4.0 原始碼分析* 紅黑樹節點 實現類:繼承自linkedhashmap.entry類
*/static
final
class treenodeextends linkedhashmap.entry
//返回當前節點的根節點
final treenoderoot()
}
4.1 hash擾動函式的變更
4.2put函式變更
/**總結 put方法流程* 分析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
) }
}
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 ...