HashMap知識總結

2021-10-19 17:38:10 字數 1232 閱讀 8111

問題5:說說hashmap是如何進行擴容的可以嗎?

問題6: 那hashcode和equals在hashmap中是怎麼用的?

jdk1.7的時候使用的是陣列+ 單鏈表的資料結構。但是在jdk1.8及之後時,使用的是陣列+鍊錶+紅黑樹的資料結構(當鍊表的深度達到8時,也就是預設閾值,會自動擴容,把鍊錶轉換成紅黑樹的資料結構,同時時間複雜度由o(n)–》o(logn))

資料結構方面的不同,jdk1.7的時候使用的是陣列+ 單鏈表的資料結構。但是在jdk1.8及之後時,使用的是陣列+鍊錶+紅黑樹的資料結構

資料插入的變化。jdk1.7用的是頭插法,而jdk1.8及之後使用的都是尾插法由於資料結構方面的變化,為啥做這樣的優化?這是因為jdk1.7是用單鏈表進行的縱向延伸,採用頭插法容易出現逆序環形鍊錶死迴圈的問題,而在jdk1.8由於資料結構採用紅黑樹,使用尾插法可以避免出現環形鍊錶死迴圈的問題

hash演算法的優化:對每乙個hash值,在它的低16位中,讓高低16位進行異或,讓它的低16位同時保持了高低16位的特徵,這樣可以盡量避免一些hash值後續出現衝突,進入到陣列中的同乙個位置。

定址演算法的優化:用與運算代替了取模運算–》即拿hash值跟陣列長度減一做與運算

就是指兩個key 或者多個key,他們算出來的hash值,與n-1 與 運算之後,發現定位出來的陣列的位置還是一樣的,hash碰撞,

jdk1.8前是在這個陣列位置掛乙個鍊錶,讓多個key-value對,同時放在陣列的乙個位置裡,然後get的時候,如果定位到陣列發現掛了乙個鍊錶,此時遍歷鍊錶,從裡面找到自己要找的那個key-value對即可。

但是假設你的鍊錶很長,可能會導致遍歷鍊錶效能會比較差。而jdk1.8做了些優化,如果鍊錶的長度達到了一定的長度,會把鍊錶轉換為紅黑樹

當儲存的容量達到了負載因子的75%就會進行擴容

建立乙個新的entry陣列,長度為原來2倍;

進行rehash操作,遍歷原來的entry陣列,將原有的entry重新hash到新陣列

是16,為啥是16,因為在底層原始碼裡定義了位運算1>>4 -->16,這是為了服務key對映到index的演算法.

首先hashmap是通過key的hashcode方法來尋找index,那如果兩個key找到的index相同,那麼他們就在乙個鍊錶上面,比如 「ab」 和 「ba」 可能index都為2,這樣她們就在乙個鍊錶上面

這個時候怎麼來找 「ab」 和 「ba」 對應的具體的值呢?就是通過equals,,就是說對equals重寫,保證相同的物件返回相同的hash值,不同的物件返回不同的hash值

HashMap知識,ArrayList知識

hashtable 的擴容機制 void resize int newcapacity entry newtable new entry newcapacity transfer newtable table newtable threshold int newcapacity loadfactor...

hashmap知識 待續

hashmap原理 hashmap是否初始化 1.hashmap預設bucket陣列多大 16 2.new hashmap 19 的時候bucket陣列多大 32 最接近19的2的冪次方 3.hashmap什麼時候開闢bucket陣列占用記憶體 put的時候 4.hashmap時擴容 put的元素達...

hashmap知識整理

hashmap底層資料結構是hash表 是由陣列加鍊表加紅黑樹實現的hash表,jdk1.8之前沒有紅黑樹。hashmap在put資料時需要先使用hash演算法結合陣列長度進行定址,找到陣列上的乙個槽位,如果槽位是空的就加入這個槽位中,如果槽位不是空的則加入該槽位上的鍊錶尾部 jdk 1.7 之前使...