hashmap原理詳解

2021-08-01 20:28:32 字數 1482 閱讀 9006

1、hashmap和hashtable的區別

hashmap       執行緒不安全、,相對而言hashmap效能會高一些。

hashtable      執行緒安全、hashtable的實現方法裡面都新增了synchronized關鍵字來確保執行緒同步。

hashmap可以使用null作為key,而hashtable則不允許null作為key

2、hashmap的實現原理

部分**:

hashmap是基於雜湊表的map介面實現。

資料結構:陣列和鍊錶的結合體。

put方法:

當往hashmap中put元素時,先根據key的hashcode計算hash值,根據hash值找到元素在陣列中的位置。

如果陣列該位置上,已經存放其他元素,則該位置上的元素將以鍊錶的形式存放,新加入的放在鍊錶的頭部,最先加入的放在鍊錶的尾部。

如果陣列該位置上,沒有元素,就直接把該元素放到該位置上。

疑問:如果兩個key通過hash%entry.length得到的index相同,會不會有覆蓋的危險?

這裡hashmap裡面用到鏈式資料結構的乙個概念。上面我們提到過entry類裡面有乙個next屬性,作用是指向下乙個entry。打個比方, 第乙個鍵值對a進來,通過計算其key的hash得到的index=0,記做:entry[0] = a。一會後又進來乙個鍵值對b,通過計算其index也等於0,現在怎麼辦?hashmap會這樣做:b.next = a,entry[0] = b,如果又進來c,index也等於0,那麼c.next = b,entry[0] = c;這樣我們發現index=0的地方其實訪問了a,b,c三個鍵值對,他們通過next這個屬性鏈結在一起。所以疑問不用擔心。也就是說陣列中儲存的是最後插入的元素。到這裡為止,hashmap的大致實現,我們應該已經清楚了。

自測:

輸出結果為5。

重複放入相同key值的hahsmap,會覆蓋原來的值

get方法:

讀取,首先計算key的hashcode,找到陣列中對應位置的某一元素,然後通過key的equals方法,在對應位置的鍊錶中找到需要的元素。

參考:

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底層原理

1.hashmap概述 hashmap是基於雜湊表的map介面的非同步實現。此實現提供所有可選的對映操作,並允許使用null值和null鍵。此類不保證對映的順序,特別是它不保證該順序恆久不變。2.hashmap的資料結構 注意,迭代器的快速失敗行為不能得到保證,一般來說,存在非同步的併發修改時,不可...

HashMap工作原理

以前使用過很多次hashmap,但是對於其是如何實現的卻不是很了解,最近看了看hashmap的原始碼加上自己的理解寫了這篇文章方便以後回憶,寫得不好的地方請提醒。hashmap繼承了abstractmap類並且實現了map cloneable serializable三個介面。ps 並不是每乙個集合...