對key的hashcode()做hash,然後再計算index;如果沒碰撞直接放到bucket裡;
如果碰撞了,以鍊錶的形式存在buckets後
如果碰撞導致鍊錶過長(大於等於treeify_threshold),就把鍊錶轉換成紅黑樹;
如果節點已經存在就替換old value(保證key的唯一性)
如果bucket滿了(超過load factor*current capacity),就要resize。
static
final
int hash(object key)
可以看到這個函式大概的作用就是利用hashcode(),低16bit和高16bit做了乙個異或,返回 hash值
最終計算bucket中的index
index = (n - 1) & hash
bucket裡的第乙個節點,直接命中;如果有衝突,則通過key.equals(k)去查詢對應的entry
若為樹,則在樹中通過key.equals(k)查詢,o(logn);
若為鍊錶,則在鍊錶中通過key.equals(k)查詢,o(n)。
當put時,如果發現目前的bucket占用程度已經超過了load factor所希望的比例(entries的數目大於capacity*load factor),那麼就會發生resize。在resize的過程,簡單的說就是把bucket擴充為2倍,之後重新計算index,把節點再放到新的bucket中。
HashMap工作原理
以前使用過很多次hashmap,但是對於其是如何實現的卻不是很了解,最近看了看hashmap的原始碼加上自己的理解寫了這篇文章方便以後回憶,寫得不好的地方請提醒。hashmap繼承了abstractmap類並且實現了map cloneable serializable三個介面。ps 並不是每乙個集合...
HashMap的工作原理
hashmap的工作原理 hashmap基於hashing原理,我們通過put 和get 方法儲存和獲取物件。當我們將鍵值對傳遞給put 方法時,它呼叫鍵物件的hashcode 方法來計算hashcode值,然後找到bucket位置來儲存值物件。當獲取物件時,通過鍵物件的equals 方法找到正確的...
HashMap的工作原理
hashmap的工作原理是近年來常見的j a面試題。幾乎每個j a程式設計師都知道hashmap,都知道 要用hashmap,知道hashtable和hashmap之間的區別,那麼為何這道面試題如此特殊呢?是因為這道題考察的深度很深。這題經常出現在高階或中高階面試中。投資銀行更喜歡問這個問題,甚至會...