HashMap的特點和底層原理學習

HashMap與HashTable在底層實現基本是一樣的,只是hashtable的方法加了synchronized關鍵字。

ConCurrentHashMap是線程安全的,但性能比hashTable好很多,因爲HashTable是鎖的整個Map對象,而
ConCurrentHashMap鎖的是部分結構。

HashMap負載因子爲0.75f

下標的算法:(n-1)&hash n爲數組的長度 初始值爲16
得到合法下標,然後去底層數組中取值,如果爲null,創建一個node對象放到數組下標爲i的位置。當
找到對應的下標已經被佔用的時候,會new一個新的Node對象並把當前的Node的next引用指向該對象,也就是
說原來該位置上只有一個元素對象,現在轉成了單向鏈表
當鏈表的長度到8時,將鏈表轉化爲紅黑樹來處理。

在JDK1.7及以前的版本中,HashMap裏是沒有紅黑樹的實現的,在JDK1.8中加入了紅黑樹是爲了防止哈希表碰撞攻擊,當鏈表鏈長度爲8時,及時轉成紅黑樹,提高map的效率。

爲什麼不用key本身的hashcode方法,而又處理了一下。
我的理解是當table很小的時候,計算元素在table中的位置(n-1)&hash,只用到了hash值的低位,
這樣當不同的hash值低位相同,高位不同的時候會產生衝突。實際上的hash值將hashcode低16位與高16位做異或運算,
相當於混合了高位和低位,增加了隨機性

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章