在jdk1.7中hashmap是以entry陣列來儲存資料。
用key的hashcode取模來決定key會被放在陣列裡的位置
如果hashcode相同,或者hashcode取模結果相同
那麼這些key會被定義到entry陣列的同乙個格仔裡,這些key會形成乙個鍊錶。
1.在jdk1.8中hashmap是以node陣列來儲存資料。
但是這個node可能是鍊錶結構,也可能是紅黑樹結構
但是如何插入的key和hashcode相同,也會被定義到node陣列的格仔裡
如果同乙個格仔裡的key不超過8個,會用鍊錶結構儲存
如果超過了8個,那麼會呼叫treefilbin函式,將鍊錶轉換為紅黑樹
那麼即使hashcode相同,由於紅黑樹的特點查詢某個特定元素,也只需要o(log n)的開銷,也就是說get/put的操作時間複雜度最差也就只有o(log n)
JDK1 7和JDK1 8HashMap的區別
jdk1.7與jdk1.8中hashmap區別 最重要的一點是底層結構不一樣,1.7是陣列 鍊錶,1.8則是陣列 鍊錶 紅黑樹結構 jdk1.7中當雜湊表為空時,會先呼叫inflatetable 初始化乙個陣列 而1.8則是直接呼叫resize 擴容 插入鍵值對的put方法的區別,1.8中會將節點插...
JDK1 8中的hashmap和JDK1 7的區別
1.資料插入的方式不同 jdk1.7用的是頭插法,而jdk1.8用的是尾插法,這是由於jdk1.7是用單鏈表進行的縱向延伸,當採用頭插法時會容易出現逆序且環形鍊錶死迴圈問題。但是在jdk1.8之後是因為加入了紅黑樹使用尾插法,能夠避免出現逆序且鍊錶死迴圈的問題。2.組成結構不同 jdk1.7的時候使...
JDK1 7的HashMap死迴圈
為什麼在jdk1.7多執行緒情況下會很容易出現hashmap死迴圈,這個還是要根據它採取的擴容策略來看,它的擴容策略是頭插法,因此會導致這樣的問題。在jdk1.8改進為尾插法,但並不意味著尾插法能適應多執行緒併發的場景,我認為其最主要的考慮就是頭插法在正常情況下是與原來鍊錶順序相逆的,而尾插不會改變...