jdk1.8之前,hashmap底層基於陣列和鍊錶。
jdk1.8,hashmap底層基於陣列+鍊錶+二叉樹(紅黑樹)。
先建立陣列
node[ ] table = new node[16] (雜湊桶初始haul)
再建立鍊錶物件
tableclass node{
hash; //hash值
key; //鍵
value; //值
node next; //用於指向鍊錶的下一層(產生衝突,用拉鍊法)
以下是具體的put過程(jdk1.8版)
1、對key求hash值,然後再計算下標
2、如果沒有碰撞,直接放入桶中(碰撞的意思是計算得到的hash值相同,需要放到同乙個bucket中)
3、如果碰撞了,以鍊錶的方式鏈結到後面(此處碰撞個人理解為hash值相同,key值不同)
4、如果鍊錶長度超過閥值( treeify threshold==8),就把鍊錶轉成紅黑樹,鍊錶長度低於6,就把紅黑樹轉回鍊錶
5、如果節點已經存在就替換舊值
6、如果桶滿了(容量16*載入因子0.75),就需要 resize(擴容2倍後重排)
下圖為取值過程:
HashMap底層原理
1.hashmap概述 hashmap是基於雜湊表的map介面的非同步實現。此實現提供所有可選的對映操作,並允許使用null值和null鍵。此類不保證對映的順序,特別是它不保證該順序恆久不變。2.hashmap的資料結構 注意,迭代器的快速失敗行為不能得到保證,一般來說,存在非同步的併發修改時,不可...
HashMap底層原理
hashmap實現map介面,非執行緒安全的,區別於concurrenthashmap。允許使用null值和null鍵,不保證對映的順序.底層資料結構是乙個 陣列 鍊錶 紅黑樹 put 根據key計算得到key.hash h k.hashcode h 16 根據key.hash計算得到桶陣列的索引i...
HashMap底層原理
預設負載因子 static final float default load factor 0.75f 無參構造 public hashmap 有參構造 public hashmap int initialcapacity public hashmap int initialcapacity,flo...