HashMap的實現原理及其特點

2021-08-17 02:05:54 字數 1614 閱讀 5978

1) hashmap可以接受

null

鍵值和值,而

hashtable

則不能,

hashmap

是非synchronized

的;儲存的是鍵值對。

2) hashmap是基於

hashing原理,

使用put(key,value)

儲存物件到

hashmap

中,使用

get(key)

從hashmap

中獲取物件,當我們給

put方法傳遞鍵和值時,我們先對鍵呼叫

hashcode()

方法,返回的

hashcode

用於找到

bucket

位置來儲存鍵物件和值物件,作為

3) 如果兩個物件hashcode

相同:儲存時:他們會找到相同的bucket

位置,發生碰撞,因為

hashmap

使用鍊錶儲存物件(每個

map.entry

都有乙個

next

指標),這個

entry

會儲存在鍊錶中。

獲取時:

會用hashcode

找到bucket

位置,然後呼叫

key.equals()

方法找到鍊錶中正確的節點

.最終找到要找的值物件

.減少碰撞:使用final

修飾的物件、或不可變的物件作為鍵,使用

(integer

、string)

(是不可變、

final的,

而且已經重寫了

equals

和hashcode

方法)這樣的

類作為鍵是非常好的,(我們可以使用自定義的物件作為鍵嗎?答:當然可以,只要它遵守了equals

和hashcode

方法定義規則,並且當物件插入到

map中之後將不會再改變。)

4) hashmap負載因子預設是

0.75

,可設定,當

map填滿了

75%的

bucket

時候,將會建立原來

hashmap

大小兩倍的

bucket

陣列,來重新調整

map的大小,並將原來的物件放入新的

bucket

陣列中,

這個過程叫做

rehashing

,因為它呼叫

hash

方法找到新的

bucket

位置。5) 重新調整map

大小可能會發生競爭問題:如果兩個執行緒都發現

hashmap

需要調整大小了,它們都會嘗試進行調整,在調整中,儲存在鍊錶中的元素的次序會反過來,因為移動

bucket

位置的時候,

hashmap

並不會將元素放在鍊錶的尾部,而是放在頭部,這是為了避免尾部遍歷,如果條件競爭發生了,就死迴圈了。

HashMap的實現原理

一。hashmap的資料結構 資料結構中有陣列和鍊錶來實現對資料的儲存,但這兩者基本上是兩個極端。陣列 陣列儲存區間是連續的,占用記憶體嚴重,故空間複雜的很大。但陣列的二分查詢時間複雜度小,為o 1 陣列的特點是 定址容易,插入和刪除困難 鍊錶 鍊錶儲存區間離散,占用記憶體比較寬鬆,故空間複雜度很小...

HashMap實現原理

hashmap 的get 方法 呼叫get方法返回entry public v get object key getentry方法 final entrygetentry object key 對key int hash key null 0 hash key for entrye table in...

HashMap實現原理

資料結構中有陣列和鍊錶來實現對資料的儲存,但這兩者基本上是兩個極端。陣列儲存區間是連續的,占用記憶體嚴重,故空間複雜的很大。但陣列的二分查詢時間複雜度小,為o 1 陣列的特點是 定址容易,插入和刪除困難 鍊錶儲存區間離散,占用記憶體比較寬鬆,故空間複雜度很小,但時間複雜度很大,達o n 鍊錶的特點是...