問題1:HashM安排的初始長度,爲何?html
初始長度是 16,每次擴展或者是手動初始化,長度必須是 2的冪。java
由於: index = HashCode(Key) & (length - 1), 若是 length是 2的 冪的話,則 length - 1就是 全是 1的二進制數,好比 16 - 1 = 1111,這樣至關因而 坐落在長度爲 length的hashMap上的位置只和 HashCode的後四位有關,這隻要給出的HashCode算法自己分佈均勻,算出的index就是分佈均勻的。算法
由於HashMap的key是int類型,因此最大值是2^31次方,可是查看源碼,當到達 2^30次方,即 併發
MAXIMUM_CAPACITY,以後,便再也不進行擴容。
問題2:高併發狀況下,爲何HashMap出現死鎖?高併發
咱們看到默認HashMap的初始長度是16,比較小,每一次push的時候,都會檢查當前容量是否超過 預約的 threshold,若是超過,擴大HashMap容量一倍,整個表裏的全部元素都須要按照新的hash算法被算一遍,這個代價較大。提到死鎖,對於 HashMap來講,貌似只能和鏈表操做有關。性能
正常ReHash過程,能夠看到,每一個元素從新算hash值,將鏈表翻轉(目的遍歷每一個bucket上的鏈表仍是用的是頭插法,時間複雜度最低),放到對應的bucket上的鏈表中優化
問題3:java8對hashMap作了什麼優化?code
簡單說: java7中 hashMap每一個桶中放置的是鏈表,這樣當hash碰撞嚴重時,會致使個別位置鏈表長度過長,從而影響性能。htm
java8中,HashMap 每一個桶中當鏈表長度超過8以後,會將鏈表轉換成紅黑樹,從而提高增刪改查的速度。源碼
參考來源:http://www.mamicode.com/info-detail-2120749.html