HashMap是基于哈希表的數(shù)據(jù)結(jié)構(gòu),它的工作原理是通過鍵(key)的哈希值來(lái)快速定位存儲(chǔ)位置。
具體工作原理如下:
- 當(dāng)向HashMap中插入鍵值對(duì)時(shí),首先會(huì)根據(jù)鍵的哈希值計(jì)算出存儲(chǔ)位置,這個(gè)位置稱為“桶”(bucket)。
- 如果該桶為空,則直接將鍵值對(duì)插入其中。
- 如果該桶不為空,則可能存在兩種情況:
- 如果鍵已經(jīng)存在,則更新對(duì)應(yīng)的值。
- 如果鍵不存在,則將新的鍵值對(duì)插入到鏈表的末尾(Java 8之后,當(dāng)鏈表長(zhǎng)度達(dá)到一定閾值(默認(rèn)為8)時(shí),鏈表會(huì)轉(zhuǎn)換為紅黑樹,以提高查詢效率)。
- 當(dāng)需要查找某個(gè)鍵對(duì)應(yīng)的值時(shí),HashMap會(huì)根據(jù)鍵的哈希值找到對(duì)應(yīng)的桶,然后在鏈表(或紅黑樹)中依次比較鍵值對(duì)的鍵,直到找到對(duì)應(yīng)的鍵值對(duì),或者鏈表(或紅黑樹)遍歷完畢仍未找到。
需要注意的是,由于哈希函數(shù)并不是完美的,不同的鍵可能會(huì)映射到同一個(gè)桶中,這種情況稱為“哈希碰撞”。為了解決哈希碰撞,HashMap使用鏈表(或紅黑樹)來(lái)存儲(chǔ)具有相同哈希值的鍵值對(duì),以避免數(shù)據(jù)丟失。