探尋hashmap

Hashmap源碼

一、 構造器:算法

  a)得到默認數組大小:1>>4 :16數組

  b) 得到負載因子:0.75:衡量hashmap的空間使用程度安全

i.過大:使用空間更加充分,可是查找效率變低,即時間複雜度變大

                   ii.太小:hashmap數據過於稀疏,形成空間浪費,即空間複雜度變大

  c)建立數組併發

二、 Put()方法:使用key的hash算法,計算出可key的存儲的數組位置,肯定key的位置後相應的value也會肯定,若是數組位置已經有數值存在,則以第一個值爲鏈頭以鏈表形式存儲。jvm

三、 Get()方法:計算出key的hashcode值,而後去尋找高併發

四、 Resize()方法:若是須要的存放的存儲空間大於默認數組大小*負載因子的乘積,那麼就發生擴容,擴大爲原來的兩倍線程

五、 問題:指針

  a)爲何hashmap的容量老是2的次方code

i.由於hashmap中有一個方法是h&table.length-1,這樣能夠減小碰撞機率。

                   ii.例子: 8&14  9&14 與  8&15  9&15 15不會發生碰撞 14會發生碰撞,這是一會我數學機率問題。

  b) 能夠的話建議使用hashmap的clear方法循環使用hashmap內存

i.應爲hashmap是強引用類型,原有不適使用的hashmap不會被jvm回收,可能形成內存泄露

高併發的hashmap

一、 狀況(1.7):內部鏈表遭到破壞,發生鏈表成環,形成死循環,cpu飆升

二、 解決:1.8 引入兩個指針聲明 確保順序

確保hashmap線程安全

一、 方法

  a)使用collections.synchronizedmap方法

  b) 使用concurrenthashmap併發集合類代替

相關文章
相關標籤/搜索