HashMap 和HashTable的區別?底層實現是什么?
區別:
(1)HashMap方法沒有synchroized修飾,線程非安全,HashTable線程安全
(2)HashMap允許key和value為null,而HashTable不允許
2 底層實現:數組+鏈表實現
jkd8開始鏈表高度到8,數組長度超過64,鏈表轉變為紅黑樹,元素以內部類Node節點存在
1)計算key的hash值,二次hash然后對數組長度取模,對應到數組下標。
2)如果沒有產生hash沖突,則直接創建node存入數組
3)如果產生hash沖突,先進行equal比較,相同則取代鈣元素,不同,則判斷鏈表高度插入鏈表,鏈表
高度達到8,並且數組長度達到64則轉變為紅黑樹,長度低於6則將紅黑樹轉回鏈表。
4)key為null,存在小標為0的位置。
示例解釋:當創建一個hashMap,往里面存儲第一個在值時,計算出hash值,發現此節點並沒有值,
則可以直接放入,此時還是數組,然后不停放入值,但是當產生hash沖突的時候,比如下標是0的位置,兩個值
計算得到的hashcode都是指向這個位置,則使用equals判斷是否相同,相同則替代,不同則將此位置所存儲的hashcode相同的兩個值做成鏈表存儲到此位置,然后當此位置存儲的值超過8個,則查詢效率會低,所以轉化為紅黑樹,加快查詢速度。
數組在長度滿的時候會自動擴容。加載因子是0.75。
鏈表轉為紅黑樹的閾值是8。