HashMap底層原理

2021-10-14 15:10:19 字數 1532 閱讀 3836

1.8之前:

hashmap在儲存元素時,首先會獲取元素的雜湊值結合位移運算,計算出該元素在陣列中的位置,如果當前位置沒有元素,就在該位置直接新增元素,如果該位置已存在其他元素,就會呼叫hashcode方法,來比較元素的hashcode值是否一致,如果不一致,那麼就在該索引位置上劃分出乙個節點來儲存當前元素。如果一致,需要進一步比較元素equlas方法,比較key的內容是否一致,如果不一致,在當前索引值上劃分乙個節點來儲存當前元素,如果一致,那麼後面的元素的value值要覆蓋前面的value

1.8之後:

但是在jdk1.8之後,hashmap 進行了一些修改,最大的不同就是利用了紅黑樹,所以其由 陣列+鍊錶+ 紅黑樹組成。因為在1.7的時候,這個鍊錶的長度不固定,所以如果key的hashcode重複之後,那麼對應的鍊錶的資料的長度就無法控制了,get資料的時間複雜度就取決於鍊錶的長度了,為了提高這一部分的效能,加入了紅黑樹,如果鍊錶的長度超過8位之後,會將鍊錶轉換為紅黑樹,極大的降低了時間複雜度

1.當建立hashmap結合物件時,在jdk1.8之前,構造方法中建立乙個乙個長度是16的entry table用來儲存鍵值對資料的

在jdk1.8之後不在是hashmap的構造方法底層建立陣列了,實在第一次呼叫put方法是建立的陣列,node table用來儲存鍵值對資料的。

2.假設想雜湊表中儲存「***」,根據「***」呼叫string類中重寫之後的hashcode方法計算出值,然後結合陣列的長度採用某種演算法計算出想node陣列中儲存資料的空間索引值。如果計算出的索引空間沒有值則直接將「***」放進去。

底層採用的是key的hashcode方法的值結合陣列長度進行(位移運算)無符號右移(>>>),按位移或(^),按位與(&)計算出索引

換可以採用:平方取中法、取餘數、偽隨機數法、拉鍊法等

會產生雜湊碰撞,若key值內容相同則替換舊的value,不然連線到列表後面,鍊錶長度超過闊值8就會轉換為紅黑樹儲存

只要兩個元素的key計算的雜湊碼值相同就會發生雜湊碰撞。jdk1.8前使用鍊錶解決雜湊碰撞。jdk1.8之後使用鍊錶+紅黑樹解決雜湊碰撞

hashcode相同,通過equlas比較內容是否相同

相同:則新的value覆蓋之前的value

不相同:則將新的鍵值對新增到雜湊表中

1.public hashmap(int initialcapacity, float loadfactor)

2.public hashmap(int initialcapacity)

3.public hashmap()

4.public hashmap(map extends k, ? extends v> m)

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...