1. 程式人生 > >HashMap的實現原理及其特點

HashMap的實現原理及其特點

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

都有一個next指標),這個Entry會儲存在連結串列中。

獲取時:會用hashCode找到bucket位置,然後呼叫key.equals()方法找到連結串列中正確的節點.最終找到要找的值物件.

減少碰撞:使用final修飾的物件、或不可變的物件作為鍵,使用(IntegerString)(是不可變、final,而且已經重寫了equalshashCode方法)這樣的wrapper類作為鍵是非常好的,(我們可以使用自定義的物件作為鍵嗎?答:當然可以,只要它遵守了equalshashCode方法定義規則,並且當物件插入到Map中之後將不會再改變。)

4) HashMap負載因子預設是0.75,可設定,當

map填滿了75%bucket時候,將會建立原來HashMap大小兩倍的bucket陣列,來重新調整map的大小,並將原來的物件放入新的bucket陣列中,這個過程叫做rehashing,因為它呼叫hash方法找到新的bucket位置。

5) 重新調整map大小可能會發生競爭問題:如果兩個執行緒都發現HashMap需要調整大小了,它們都會嘗試進行調整,在調整中,儲存在連結串列中的元素的次序會反過來,因為移動bucket位置的時候,HashMap並不會將元素放在連結串列的尾部,而是放在頭部,這是為了避免尾部遍歷,如果條件競爭發生了,就死迴圈了。