HashMap的底層實現原理

2021-09-26 23:13:59 字數 2010 閱讀 6103

hashmap的底層是通過陣列+鍊錶(即雜湊表)的結構來實現的。

hashmap的例項有兩個引數影響其效能:初始容量載入因子

初始容量只是雜湊表在建立時的容量,載入因子是雜湊表在其容量自動增加之前可以達到多滿的一種尺度。當雜湊表中的條目超出了載入因子與當前容量的乘積時,通過呼叫rehash方法將容量翻倍。

簡單說下hashmap的工作原理

hashmap基於hashing原理,我們通過put()和get()方法儲存和獲取物件。當我們將鍵值對傳遞給put()方法時,它呼叫鍵物件的hashcode()方法來計算hashcode,然後找到bucket位置來儲存值物件。當獲取物件時,通過鍵物件的equals()方法找到正確的鍵值對,然後返回值物件。hashmap使用鍊錶來解決碰撞問題,當傳送碰撞了,物件將會儲存在鍊錶的下乙個節點中。hashmap在每個鍊錶的節點中儲存鍵值對物件。

面試中一些常見的問題:

「你知道hashmap的工作原理嗎?」 「你知道hashmap的get()方法的工作原理嗎?」

:hashmap是基於hashing的原理,我們使用put(key,value)儲存物件到hashmap中,使用get(key)從hashmap中獲取物件。當我們給put()方法傳遞鍵和值時,我們先對鍵呼叫hashcode()方法,返回的hashcode用於找到bucket位置來儲存entry物件。當獲取物件時,首先根據鍵物件的hashcode定位到桶,然後通過鍵物件的equals()方法找到正確的鍵值對,然後返回物件。

「當兩個物件的hashcode相同會發生什麼?」

:因為hashcode相同,所以它們的bucket位置相同,「碰撞」會發生。因為hashmap使用鍊錶儲存物件,這個entry(包含有鍵值對的map.entry物件)會儲存在鍊錶中。

「如果兩個鍵的hashcode相同,你如何獲取值物件?」

:首先通過鍵物件的hashcode定位到桶,如何呼叫鍵物件的equals()方法去找到鍊錶中正確的節點,最終找到要找的值物件。

「如果hashmap的大小超過了負載因子定義的容量,怎麼辦?」

:預設的負載因子大小為0.75,也就是說,當乙個map填滿了75%的bucket時候,和其他集合類一樣(如arraylist等),將會建立大原來hashmap大小的兩倍的bucket陣列,來重新調整map的大小,並將原來的物件放入新的bucket陣列中。這個過程叫做rehashing,因為它呼叫了hash方法找到新的bucket位置。

「你了解重新調整hashmap大小存在什麼問題嗎?」

:當重新調整hashmap大小的時候,在多執行緒的情況下存在競爭,因為如果兩個執行緒都發現hashmap需要重新調整大小了,它們會同時試著調整大小。在調整大小的過程中,儲存在鍊錶中的元素的次序會反過來,因為移動到新的bucket位置的時候,hashmap並不會將元素放在鍊錶的尾部,而是放在頭部,這是為了避免尾部遍歷。如果條件競爭發生了,那麼就死迴圈了。

「為什麼string,integer這樣的包裝類適合作為主鍵?」

答:因為string是不可變的,也是final的,而且已經重寫了equals()和hashcode()方法了。其他的包裝類也有這個特點。不可變性是必要的,因為為了要計算hashcode(),就要防止鍵本身的值改變,如果鍵值在放入和獲取時返回不同的hashcode的話,那麼就不能從hashmap中找到你想要的物件。不可變性還有其他優點如執行緒安全。

「我們可以使用自定義的物件作為鍵嗎?」

:當然你可以使用任何物件作為鍵,只要它遵守了equals()和hashcode()方法的定義規則,並且當物件插入map中之後將不會再改變了。

參考文章:

hashmap底層實現原理

每次初始化hashmap都會構造乙個table陣列,而table陣列的元素為entry節點。static class entryimplements map.entryhashmap也可以說是乙個陣列鍊錶,hashmap裡面有乙個非常重要的內部靜態類 entry,這個entry非常重要,它裡面包含了...

HashMap底層實現原理

hashmap map new hashmap 在例項化以後,底層建立了長度為16的一維陣列entry table 已經執行過put操作.map.put key1 value1 呼叫key1所在類的hashcode 計算key1雜湊值,此雜湊值經過某種演算法計算後,得到在entry陣列中的存放位置 ...

HashMap底層實現原理

一 jdk1.7中hashmap的底層實現原理 首先,當我們通過hashmap的構造方法建立乙個hashmap物件時,底層就會建立乙個entry型別的一維陣列 預設初始化長度為16 當我們執行put操作的時候,會呼叫key所屬類的hashcode方法計算出key的hash值,然後將hash值通過雜湊...