HashMap的實現原理及其特點
阿新 • • 發佈:2019-02-12
1) HashMap可以接受null鍵值和值,而HashTable則不能,HashMap是非synchronized的;儲存的是鍵值對。
2) HashMap是基於hashing原理,使用put(key,value)儲存物件到HashMap中,使用get(key)從HashMap中獲取物件,當我們給put方法傳遞鍵和值時,我們先對鍵呼叫hashCode()方法,返回的hashCode用於找到bucket位置來儲存鍵物件和值物件,作為Map.Entry.
3) 如果兩個物件hashCode相同:
儲存時:他們會找到相同的bucket位置,發生碰撞,因為HashMap使用連結串列儲存物件(每個Map.Entry
獲取時:會用hashCode找到bucket位置,然後呼叫key.equals()方法找到連結串列中正確的節點.最終找到要找的值物件.
減少碰撞:使用final修飾的物件、或不可變的物件作為鍵,使用(Integer、String)(是不可變、final的,而且已經重寫了equals和hashCode方法)這樣的wrapper類作為鍵是非常好的,(我們可以使用自定義的物件作為鍵嗎?答:當然可以,只要它遵守了equals和hashCode方法定義規則,並且當物件插入到Map中之後將不會再改變。)
4) HashMap負載因子預設是0.75,可設定,當
5) 重新調整map大小可能會發生競爭問題:如果兩個執行緒都發現HashMap需要調整大小了,它們都會嘗試進行調整,在調整中,儲存在連結串列中的元素的次序會反過來,因為移動bucket位置的時候,HashMap並不會將元素放在連結串列的尾部,而是放在頭部,這是為了避免尾部遍歷,如果條件競爭發生了,就死迴圈了。