hashmap是乙個雜湊桶,用鍵值對的方式儲存資料,採用陣列和鍊錶的資料結構,因此它既具有陣列線性查詢的優點又具有鍊錶定址修改的優點。它是
非執行緒安全的。hashmap的主幹是乙個entry陣列。entry是hashmap的基本組成單元,每乙個entry包含乙個key-value鍵值對。主幹陣列的長度一定是2的次冪(能保證得到的新的陣列索引和老陣列索引一致,大大減少了之前已經雜湊良好的老陣列的資料位置重新調換)。所以,hashmap的整體結構如下:
1.對key求hash,計算出所在陣列的下標
2.如果沒有碰撞,直接放入桶中
3.如果有碰撞,以鍊錶的方式鏈結到後面
4.如果鍊錶長度超過閾值(treeify_threshold==8),把鍊錶轉為紅黑樹,如果
長度低於6,把紅黑樹轉為鍊錶。
5.如果節點已經存在就替換舊值
6.如果桶滿了(容量16*載入因子0.75),就需要 resize(擴容2倍後重排)
當我們呼叫get()方法,hashmap會使用鍵物件的hashcode找到bucket位置,找到bucket位置之後,會呼叫keys.equals()方法去找到鍊錶中正確的節點,
最終找到要找的值物件。
開放定址法:當衝突發生時,使用某種探查技術在雜湊表中形成乙個探查(測)序列。沿此序列逐個單元地查詢,直到找到給定的位址。
鍊錶法:如果hashcode重複就在該位置生成乙個鍊錶,將該物件放在鍊錶尾部
1、每個節點非紅即黑
2、根節點總是黑色的
3、如果節點是紅色的,則它的子節點必須是黑色的(反之不一定)
4、每個葉子節點都是黑色的空節點(nil節點)
5、從根節點到葉節點或空子節點的每條路徑,必須包含相同數目的黑色節點(即相同的黑色高度)
HashMap實現原理
hashmap 的get 方法 呼叫get方法返回entry public v get object key getentry方法 final entrygetentry object key 對key int hash key null 0 hash key for entrye table in...
HashMap實現原理
資料結構中有陣列和鍊錶來實現對資料的儲存,但這兩者基本上是兩個極端。陣列儲存區間是連續的,占用記憶體嚴重,故空間複雜的很大。但陣列的二分查詢時間複雜度小,為o 1 陣列的特點是 定址容易,插入和刪除困難 鍊錶儲存區間離散,占用記憶體比較寬鬆,故空間複雜度很小,但時間複雜度很大,達o n 鍊錶的特點是...
HashMap實現原理
public v put k key,v value 如果i索引處的entry為null,表明此處還沒有entry。modcount 將key value新增到i索引處。addentry hash,key,value,i return null 從上面的源 中可以看出 當我們往hashmap中put...